Ios Swift:如何从一个UIViewController访问可变字符串数组到TableView单元格文件

Ios Swift:如何从一个UIViewController访问可变字符串数组到TableView单元格文件,ios,swift,uitableview,Ios,Swift,Uitableview,我有一个名为TableViewController的视图控制器和另一个名为feed.swift的自定义单元格 电池被正确地重复使用,我在各种按钮上贴上了标签,因为我不知道按下了哪个按钮。 在我的CellForRowatineXpath中,我正在用我解析过的json填充我的用户名。看起来像这样 cell.username.text = username[indexPath.row] output-> ["andre gomes", "renato sanchez", "renato

我有一个名为TableViewController的视图控制器和另一个名为feed.swift的自定义单元格 电池被正确地重复使用,我在各种按钮上贴上了标签,因为我不知道按下了哪个按钮。 在我的CellForRowatineXpath中,我正在用我解析过的json填充我的用户名。看起来像这样

cell.username.text = username[indexPath.row]    
output-> ["andre gomes", "renato sanchez", "renato sanchez"]
然后我像这样标记了我的用户名按钮

cell.usernamePress.tag = indexPath.row
这在我的TableViewController中进行

在my feed.swift中,我检查是否按下了按钮,并打印出分配给该按钮的标签

@IBAction func usernameBut(sender: AnyObject) {
    print(usernamePress.tag)
}
output-> 2
现在我需要访问feed.swift中TableViewController的用户名数组,并执行类似username[usernamePress.tag]的操作

我尝试创建一个global.swift文件,但无法将其配置为字符串数组

import Foundation

class Main {
var name:String
init(name:String) {
    self.name = name
  }    
}
var mainInstance = Main(name: "hello")
即使这样做了,我还是试着打印mainInstance.name,即使更改了它,它还是返回了hello。我想要一个解决方案,其中字符串数组保存我在TableViewController中设置的值,并且我可以在feed.swift中使用它们
欢迎提出任何建议!很抱歉,如果对此有任何类似的问题,但我无法确定如何将其用于可变字符串数组

您应该向tableViewCell添加弱数组属性:

弱var userNameArray:[字符串]

然后在tableViewController中,将用户名数组传递到单元格中:

有趣的tableView(tableView:UITableView,cellForRowAtIndexPath:nsindepath)->UITableView单元格{

//创建单元格,然后

if let array = self.username {
  cell.userNameArray = array
}
}


然后,您可以使用单元格本身中的数组填充其字段句柄按钮点击等。

我建议您不要直接在FeedCell中使用数组,而是将按下事件返回到TableViewController,在那里处理事件。根据苹果要求您使用的MVC方案(签出),所有数据操作都应该在控制器中进行,然后控制器使用这些数据准备视图。视图不负责显示正确的值

为了解决您的问题,我会选择通过委派模式传回press事件,例如,您创建一个FeedCellDelegate协议,定义按下按钮时要调用的函数:

protocol FeedCellDelegate {
    func feedCell(didPressButton button: UIButton, inCell cell: FeedCell)
}
然后在FeedCell内添加一个委托属性,该属性由视图通知事件:

class FeedCell {
    var delegate: FeedCellDelegate?
    ...
    @IBAction func pressedUsernameButton(sender: UIButton) {
        delegate?.feedCell(didPressButton: sender, inCell: self)
    }
}
如果TableViewController随后符合刚刚定义的协议(实现其中定义的方法),并将ViewController指定为视图的委托,则可以处理控制器中的逻辑:

class TableViewController: UITableViewController, FeedCellDelegate {
     ...
     override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
         let cell = tableView.dequeueReusableCellWithIdentifier("FeedCell", forIndexPath: indexPath) as! FeedCell
         cell.delegate = self
         // Further setup
         return cell
     }

     func feedCell(didPressButton button: UIButton, inCell cell: FeedCell) {
         guard let indexPath = tableView.indexPathForCell(cell) else { return }

         // Do your event-handling
         switch (button.tag) {
         case 2: print("Is username button")
         default: print("Press not handled")
         }
     }
}

正如你可能认识到的,我改变了你的班名。Feed听起来更像是一个模型类,而FeedCell暗示了它显示数据的角色。如果您为类和变量选择自我解释的名称,这会使程序员的生活变得更轻松,所以请随意调整。:)

在声明代理时的PressedUserName按钮操作中,我得到1。无关参数标签按call和2中的UsernameButtonInCell。我通过使用?代码看起来像这个委托人?.feedCell(self),但是当我点击它时,它给了我一个提示:对不起,我没有编译代码,并且在那里犯了两个错误。我更新了答案,现在应该可以了。谢谢nick为我指出协议和代表的方向。他们当然是要走的路:)@AmeyaVichare:你为什么不接受我的回答?有什么问题吗?我只是在等待一个更好的选择,因为我有很多按钮,为每个按钮创建press back变得越来越混乱。你不能对数组(字符串)应用弱。数组是一个结构,对吗?