菜鸟教程小白 发表于 2022-12-11 19:35:54

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&#39;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)-&gt;()

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]
查看完整版本: ios - 在 View Controller 之间传递对象