将数组从视图控制器传递到视图控制器返回空数组

Posted

技术标签:

【中文标题】将数组从视图控制器传递到视图控制器返回空数组【英文标题】:Pass Array from View Controller To View Controller Returns Empty Array 【发布时间】:2020-06-10 18:10:18 【问题描述】:

这类问题有问有答,但我的具体情况返回一个空数组。我首先在 View Controller 1 (VC1) 中创建了一个数组。 VC1 包括一个集合视图。我尝试将 UIView 添加到 cellForItem func 中的数组。

/// 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

我在调试中确认,当集合视图运行时,它确实将 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)")

这将在调试中返回以下显示空数组。

messagesViewController.messageViewArray = (
)

为什么数组对象不保留在 VC2 中?我可以对 VC2 中的 messageViewArray 进行哪些更改。在此先感谢您的时间。

【问题讨论】:

你从VC1到VC2怎么样?执行 Segue 还是以编程方式执行?如果您可以添加该代码会有所帮助。 不是顺序。 VC1 嵌入在 VC2 中嵌入的视图控制器中。这是一个聊天应用程序,VC1 控制聊天对话。所以没有从 VC1 到 VC2 的直接链接。 VC1 和 VC2 之间必须有一种链接方式。你能张贴一张照片,说明这一切是如何构成的吗?它是如何嵌入的? 【参考方案1】:

@Frankenstein's answer 是对的。

以下代码

let messagesViewController  =  MessagesViewController()

使用 messageViewArray 的空实例创建 MessagesViewController 类的新实例。

【讨论】:

谢谢。对于弗兰肯斯坦的回答,您对我的 cmets 有什么建议吗?还没有开始工作。【参考方案2】:

您正在VC2 中创建MessagesViewController 的新实例,它将具有cellViewArray 的初始值,即NSMutableArray(),在将其打印为空时得到。要么您需要将MessagesViewController 的实例传递给VC2 的实例weak var,要么将cellViewArray 传递给VC2,这将是一种更好的方法。然后您可以打印出cellViewArray,而无需像在此处所做的那样创建MessagesViewController 的新实例。

【讨论】:

嗨弗兰肯斯坦,谢谢。您能否就如何将数组从 VC1 传递到 VC2 提出建议?我尝试在 VC1 中使用 defaults.set(cellView, forKey: "arrayKey") 保存数组,并使用 UserDefaults.standard.object(forKey: "YourKey") 作为! VC2 中的 NSArray,但出现错误“尝试插入非属性列表” 如果我尝试其他方法并使 MessageViewController 成为弱变量,我会收到以下警告“实例将被立即解除分配,因为变量 'messagesViewController' 是 'weak'” 您的帖子没有提供有关 VC1 和 VC2 之间关系的任何信息。修改您在问题中给出的代码,并添加它们之间的关系。只有这样我们才能帮助您。 我在代码参考的顶部添加了 3 行,以帮助描述 MessagesViewController 的使用方式。 MessagesViewController 位于我解锁以添加代码的 pod 文件中。我的应用程序在 VC3 中将其子类化,然后在 VC2 中引用。 VC3 不包含 cellForItem 集合视图函数,这是我需要创建数组的地方,所以我无法在 VC3 中创建数组。这有帮助吗? @JBeesky 你说过你需要在 VC2 中从 VC1 访问一个数组。你如何从 VC1 到 VC2。他们是什么关系。一旦我们知道我们可以提供帮助。【参考方案3】:

这行得通。您可以直接访问它。具体原因我不确定,欢迎其他人解释。

在 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

【讨论】:

以上是关于将数组从视图控制器传递到视图控制器返回空数组的主要内容,如果未能解决你的问题,请参考以下文章

将数组数据从视图传递到控制器并反向 php codeigniter

将 JavaScript 数组从视图传递到 Laravel 控制器

Laravel 5.2 - 如何将变量(数组和整数)从视图传递到控制器?

全局变量在不同视图控制器中使用时返回空值

将js复杂数组传给mvc控制器,然后返回另一个视图

将嵌套数组从控制器传递到 laravel 中的视图