我正在开发一款应用,我想让它看起来像iOS上的设置页面:
我想要复制的行为是在单元格中找到的行为" From / To"和#34;允许来自"。如果您注意到,那些单元格会显示用户插入的数据。我怎么能复制那个?
首先,我对iOS很新,所以无论我想出什么,都可能不是我案例的最佳解决方案。
这就是我的想法(向右添加标签并设置其值):
这是最好的方法吗?另外,我该如何设置该值?用户从详细信息视图返回后应该如何更新该单元格?
答案 0 :(得分:1)
当详细信息视图中的某些值发生更改时,您基本上希望更新上一个视图中的内容(我们称之为FirstViewController
)。一种可行的方法是通过Protocols and Delegates
。假设您已经知道storyboards
和segues
这里有一个例子。在UILabel
中按下按钮时,此示例只会更改FirstViewController
中DetailViewController
的文字。
让我们从DetailViewController
开始。您希望观察此场景中的更改并相应地更新其他场景中的数据。因此,您需要在此课程中定义protocol。
protocol DetailDelegate {
func updateCellWith(_ data:String)
}
这个类的完整定义如下所示:
import UIKit
protocol DetailDelegate {
func updateCellWith(_ data:String)
}
class DetailViewController: UIViewController {
var delegate: DetailDelegate?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
//On button tap the cell content will change in the previous scene through the delegate method
@IBAction func didTapBtn(_ sender: AnyObject) {
delegate?.updateCellWith("Cell updated")
}
}
FirstViewController
将是delegate
的{{1}},并且符合DetailViewController
。您将在转换前将DetailDelegate
设置为FromViewController
的代理。
DetailViewController
点击按钮,class FirstViewController: UIViewController, DetailDelegate {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
// Mark Navigation
@IBAction func moveToDetailVC(_ sender: AnyObject) {
performSegue(withIdentifier: "detail", sender: indexPath)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let vc = segue.destination as! DetailViewController
vc.delegate = self
}
}
会通过委托方法DetailViewController
将字符串Cell updated
传递给FirstViewController
。