在Swift3中没有故事板的xib文件之间传递数据

时间:2017-05-12 07:24:58

标签: ios swift3 xib

我是swift的新手(并且是StackOverflow的新手)并且现在学习使用nib文件,因为我已经用故事板学习了很多东西。 在storyboard中,我们可以实例化segues和unwindSegues以从一个VC获取数据到另一个VC。如何在不使用故事板的情况下做同样的事情?

我目前有一个scrollview( MainViewController.xib ),可以在其上加载tableview( ContactView.xib )。我有一个覆盖tableview的添加按钮,当前没有响应。 当我点击添加按钮向我的tableview添加新数据然后展开以反映表中的新数据时,我希望能够加载另一个视图( AddContact.xib ),但是没有使用故事板。

如果需要,我可以提供我的代码,但我只是想找个人指出正确的方向。我知道这可以使用导航控制器实现,但我似乎无法找到适合它的教程(大多数都是旧的并使用Obj-C。我不熟悉Obj-C)。

我甚至看过一些类似的问题:thisthis 但他们没有回答我的问题。

感谢任何帮助。谢谢。

我的AppDelegate:

class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?
var mainVC: MainViewController? = nil


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.
    mainVC = MainViewController(nibName: "MainViewController", bundle: nil)
    let frame = UIScreen.main.bounds
    window = UIWindow(frame: frame)
    window!.rootViewController = mainVC
    window!.makeKeyAndVisible()
    return true

}

MainViewController.swift:

class MainViewController: UIViewController {

@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    let contactView: ContactView = ContactView(nibName: "ContactView", bundle: nil)
    let dialerView: DialerView = DialerView(nibName: "DialerView", bundle: nil)

    self.addChildViewController(dialerView)
    self.scrollView.addSubview(dialerView.view)
    dialerView.didMove(toParentViewController: self)

    self.addChildViewController(contactView)
    self.scrollView.addSubview(contactView.view)
    contactView.didMove(toParentViewController: self)

    var contactViewFrame : CGRect = contactView.view.frame
    contactViewFrame.origin.x = self.view.frame.width
    contactView.view.frame = contactViewFrame

    self.scrollView.contentSize = CGSize(width: self.view.frame.width * 2, height: self.view.frame.height)
}
}

我的ContactView.xib:

class ContactView: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var searchBar: UISearchBar!
var names = ["Rohan", "Rahul", "Sneh", "Paa", "Maa", "Vatsal", "Manmohan"]
var numbers = ["9830000001", "9830000002", "9830000003", "9830000004", "9830000005", "9830000006", "9830000007"]
let navVC: UINavigationController? = nil

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return names.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    tableView.rowHeight = CGFloat(60)
    tableView.register(UINib(nibName: "ContactCell", bundle: nil), forCellReuseIdentifier: "Contact")
    let cell = tableView.dequeueReusableCell(withIdentifier: "Contact", for: indexPath) as! ContactCell
    cell.nameLabel.text = names[indexPath.row]
    cell.numLabel.text = numbers[indexPath.row]
    return cell
}

// Make delete-able in scroll view
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == UITableViewCellEditingStyle.delete {
        names.remove(at: indexPath.row)
        numbers.remove(at: indexPath.row)
        tableView.reloadData()
    }
}

我的 AddContact.xib 只定义了出口。

编辑:感谢评论者,我找到了解决方案。 对于任何想知道我是如何做到的人,我将发布以下步骤:

第1步:创建协议(我在 MainViewController.xib 中这样做了)

protocol NewContactDelegate {
    func add_Contact (name: String, num: String)
}

步骤2:在senderVC中为其实例化委托。 AddContact.xib 是我的senderVC

class AddContact: UIViewController {

var delegate: NewContactDelegate? = nil
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var numField: UITextField!
override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

@IBAction func saveContact(_ sender: UIButton) {
    if delegate != nil {
        if let name = nameField?.text, let num = numField?.text {
            delegate?.add_Contact(name: name, num: num)
            dismiss(animated: true, completion: nil)
        }
    }
}

步骤3:使ReceivingVC符合委托并接受数据。

class ContactView: ....., NewContactDelegate {

func add_Contact(name: String, num: String) {
    names.append(name)
    numbers.append(num)
    addressBook.reloadData() // This is my TableView outlet
}
}

**

  

注意:请记住在 RecievingVC 中将委托声明为非零值,以确保 SenderVC 中的@IBAction按预期工作。

**

0 个答案:

没有答案