ios - 在 View Controller 之间传递对象
<p><p>最近我一直在开发一个新应用程序,但我正在努力在 ViewController 之间传递数据。</p>
<p>我使用一个 ViewController ,它包含一个容器 View ,我在其中使用谷歌地图。正如你们中的一些人所知,在谷歌地图上放置一个按钮是不可能的,因为它覆盖了所有内容(这就是我将它作为容器 View 的原因)。现在我遇到了一个问题,我无法制作一个可以<code>performSegue</code> 的操作按钮,而且我也未能通过<code>NotificationCenter</code> 传递一个对象。我制作了一个名为 Song 的模型,我想将歌曲 <code>List</code> 传递给其他 Controller (表格 View )。 </p>
<blockquote>
<p>class Song {<br/>
var sid: String <br/>
var songName: String<br/>
var artistId: String<br/>
var length: String<br/>
var songImage: String?<br/>
var album: String<br/>
var lastUpdate:Date? <br/>}</p>
</blockquote>
<p>对于在 VC 之间移动此列表有何想法或建议?
但是,这些 View 之间没有真正的联系,mainVC 将它们都作为容器保存。</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>所以你的 MainController 拥有两个必须交换数据的 Controller ?方法是使用 <strong>Delegate</strong> 模式并设置 Controller 之间的弱关系:</p>
<pre><code>protocol SongSelectable {
func songSelected(_ song: Song)
}
class PlaylistController: UIViewController {
weak var songSelectable: SongSelectable?
}
class MapController: UIViewController, SongSelectable {
func songSelected(_ song: Song){
//do your code
}
}
class MainController: UIViewController {
weak var mapController: MapController?
weak var playlistController: PlaylistController?
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// You can't guaranty order here, so some duplication required
if let controller = segue as? MapController {
mapController = controller
playlistController?.songSelectable = controller
}
else if let controller = segue as? PlaylistController {
playlistController = controller
controller.songSelectable = mapController
}
}
}
</code></pre>
<p>另一种选择:通过 block 建立连接。这是一种更现代、更快捷的方式:</p>
<pre><code>typealias SongHandler = (Song)->()
class PlaylistController: UIViewController {
var songHandler = SongHandler?
}
class MapController: UIViewController {
func songSelected(_ song: Song){
//do your code
}
}
class MainController: UIViewController {
weak var mapController: MapController?
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let controller = segue as? MapController {
mapController = controller
}
else if let controller = segue as? PlaylistController {
controller.songHandler = { (song) in self.mapController?.songSelected(song)
}
}
}
</code></pre>
<p>请注意,上面的代码片段只是说明,您有很多方法可以访问 Controller 、设置委托(delegate)或 block 。</p></p>
<p style="font-size: 20px;">关于ios - 在 ViewController 之间传递对象,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/48227890/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/48227890/
</a>
</p>
页:
[1]