从View Controller传递数组到View Controller 返回空数组。

问题描述 投票:0回答:1

这类问题有人问过,也有人回答过,但我的具体情况是返回一个空数组。我首先在视图控制器1(VC1)中创建一个数组。VC1包括一个集合视图。我尝试在cellForItem func中为数组添加一个UIView。

/// A subclass of `UIViewController` with a `MessagesCollectionView`  object
/// that is used to display conversation interfaces.

open class MessagesViewController: UIViewController,
UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {


public var cellViewArray = NSMutableArray() 

open func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath:    IndexPath) -> UICollectionViewCell {

let cell = messagesCollectionView.dequeueReusableCell(TextMessageCell.self, for: indexPath)
        cell.configure(with: message, at: indexPath, and: messagesCollectionView)

        let cellView = cell.contentView
        //print("cellView = \(cellView)")
        messageViewArray.insert(cellView, at: indexPath.row)
        //print("messageViewArray = \(String(describing: messageViewArray))")

return cell
}

我在debug中确认,当集合视图运行时,确实将cellView保存到messageViewArray中,而且都不是nil。

messageViewArray = (
"<UIView: 0x142913720; frame = (0 0; 359 140); autoresize = W+H; gestureRecognizers =  <NSArray: 0x142913d30>; layer = <CALayer: 0x1429138a0>>",
"<UIView: 0x14291bbc0; frame = (0 0; 359 256); autoresize = W+H; gestureRecognizers = <NSArray: 0x14291c1d0>; layer = <CALayer: 0x14291bd40>>",
"<UIView: 0x142929520; frame = (0 0; 359 256); autoresize = W+H; gestureRecognizers = <NSArray: 0x142929b30>; layer = <CALayer: 0x1429296a0>>",
"<UIView: 0x14298e610; frame = (0 0; 359 140); autoresize = W+H; gestureRecognizers = <NSArray: 0x14298ec20>; layer = <CALayer: 0x14298e790>>",
"<UIView: 0x142929520; frame = (0 0; 359 256); autoresize = W+H; gestureRecognizers = 
)

在View Controller 2 (VC2)中,我尝试从VC1访问messageViewArray,并对UIView对象做一些事情。

let messagesViewController  =  MessagesViewController()
print("messagesViewController.messageViewArray = \(messagesViewController.integerViewArray.description)")

这在debug中返回了下面的结果,显示为空数组。

messagesViewController.messageViewArray = (
)

为什么数组对象在VC2中不能持久化?我可以做什么改变来引用VC2中的messageViewArray。先谢谢你的时间。

ios swift view uiviewcontroller nsarray
1个回答
1
投票

@Frankenstein 的回答 是正确的。

以下代码

let messagesViewController  =  MessagesViewController()

创建一个新的MessagesViewController类的实例,其中包含一个空的 messageViewArray.


0
投票

你正在创建一个新的实例 MessagesViewControllerVC2 的初始值。cellViewArray 也就是 NSMutableArray() 的实例,而把它打印出来时得到的是空的。要么你需要通过 MessagesViewController 的实例。VC2 作为 weak var 或通过 cellViewArrayVC2 这将是一个更好的方法。然后你可以打印出 cellViewArray 而不需要创建新的 MessagesViewController 就像你在这里做的那样。


0
投票

这样就可以了。你可以直接访问它。我不清楚具体的道理,欢迎别人来解释。

在VC 2中--声明变量。

/// A subclass of `UIViewController` with a `MessagesCollectionView` object
/// that is used to display conversation interfaces.
open class MessagesViewController: UIViewController,
UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {

public static var arrayNameInVCTwo : NSMutableArray? = nil

在VC 1中--引用VC 2中的变量

let arrayNameInVCOne = MessagesViewController.arrayNameInVCTwo
© www.soinside.com 2019 - 2024. All rights reserved.