Ios Swift:如何从一个UIViewController访问可变字符串数组到TableView单元格文件
我有一个名为TableViewController的视图控制器和另一个名为feed.swift的自定义单元格 电池被正确地重复使用,我在各种按钮上贴上了标签,因为我不知道按下了哪个按钮。 在我的CellForRowatineXpath中,我正在用我解析过的json填充我的用户名。看起来像这样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
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变得越来越混乱。你不能对数组(字符串)应用弱。数组是一个结构,对吗?