这是我的目标:点击Start
按钮后,我希望启用Send
按钮。以下是我的视图控制器在加载时的样子:
如您所见,Send
按钮被禁用,这是必需的。我通过在TaskListTableViewCell.swift
中编写以下代码来禁用它(为了简洁起见,我删除了一些其他不相关的代码):
class TaskListTableViewCell: UITableViewCell {
@IBOutlet weak var sendButton: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
sendButton.enabled = false
}
}
为了防止你看到更好,这就是Main.storyboard
视图控制器的样子:
在我的TaskListViewController
中,我有以下代码:
@IBAction func startButtonTapped(sender: AnyObject) {
//write the code here to change sendButton.enabled = true
}
问题是,我似乎找不到改变sendButton.enabled = true
的方法。我试过了:
@IBAction func startButtonTapped(sender: AnyObject) {
let taskListViewController = TaskListViewController()
taskListTableViewCell.sendButton.enabled = true
}
我也尝试过:
class TaskListTableViewCell: UITableViewCell {
@IBOutlet weak var sendButton: UIButton!
func changeSendButtonEnabled() {
sendButton.enabled = true
}
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
sendButton.enabled = false
}
}
在我的TaskListViewController.swift
中,我写道:
@IBAction func startButtonTapped(sender: AnyObject) {
let taskListViewController = TaskListViewController()
taskListTableViewCell.changeSendButtonEnabled()
}
但这两种解决方案都会出现此错误:fatal error: unexpectedly found nil while unwrapping an Optional value
。
我已经阅读了其他一些关于从另一个类访问IBOutlet的帖子,例如此帖:How to access an IBOutlet from another class,Accessing IBOutlet from another class,Access an IBOutlet from another class in Swift和using IBOutlet from another class in swift。但是,这些帖子都没有能够解决我的问题。
答案 0 :(得分:4)
请尝试这个,它可以解决您的问题。
// CustomCell.swift
import UIKit
import Foundation
class CustomCell: UITableViewCell {
@IBOutlet weak var btnTap : UIButton!
@IBOutlet weak var lblTitle : UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
btnTap.enabled = false
}
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
// Configure the view for the selected state
}
}
// ViewController.swift
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{
@IBOutlet weak var table: UITableView!
@IBOutlet weak var btnSTART: UIButton!
var isStartBtnTapped : Bool = false
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func startBtnTapped(sender: AnyObject) {
isStartBtnTapped = true
self.table.reloadData()
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1;
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 3;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let reuseIdentifier:String="cell";
var cell:CustomCell!
cell=tableView.dequeueReusableCellWithIdentifier(reuseIdentifier) as! CustomCell;
if cell==nil
{
cell=CustomCell(style: UITableViewCellStyle.Default, reuseIdentifier: reuseIdentifier);
}
if(isStartBtnTapped == true){
cell.lblTitle.text = "Enabled"
cell.btnTap.enabled = true
}else{
cell.lblTitle.text = "Disabled"
cell.btnTap.enabled = false
}
return cell;
}
}
答案 1 :(得分:1)
包含tableview单元格的tableview需要一个数据源才能用数据填充它。这种情况下的数据是按钮是否启用。您可以创建一个包含Bool的对象(或结构)数组,以告知该按钮是否已启用。启用开始按钮后更改布尔值,然后调用tableView.reloadData()
。然后,您的数据源将重新加载对象数组,然后cellForRowAtIndexPath
将被称为重新配置您的单元格。
您获得致命错误的原因可能是因为您尝试访问的tableviewcell的引用为零。当您调用方法更改按钮状态时,它在那里找不到任何内容并崩溃。虽然很难确切知道发生了什么,因为缺少代码