函数创建2个相同的类实例,而不是仅创建1个

时间:2018-08-17 22:50:21

标签: swift xcode

我对iOS开发还比较陌生,对您的帮助将不胜感激!

我正在尝试创建“事件”类的新实例。

class Event  {

var EventName: String
var EventPhoto: UIImage?

init?(EventName: String, EventPhoto: UIImage?) {


guard !EventName.isEmpty else {
        return nil
    }


// Initial initilization of the values
self.EventName = EventName
    self.EventPhoto = EventPhoto

    // If some of the values are left blank, this will return nil to signal the problem


}
}

下面是重写函数,据我所知,该函数负责创建实例:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    super.prepare(for: segue, sender: sender)

    guard let button = sender as? UIBarButtonItem, button === saveButton else {
        os_log("Cancelling Action, The Save Button Was not Pressed", log: OSLog.default,type: .debug)
    return
    }

let EventName = NewEventNameField.text ?? ""
let EventPhoto = NewEventImage.image


event = Event(EventName: EventName, EventPhoto: EventPhoto)

}

据我了解,override函数应创建该类的新实例,然后将其显示在显示“事件”表的表视图控制器中。我的问题是当通过“创建实例”按钮调用该函数时,它将创建两个相同的实例,这些实例具有从视图字段中的文本字段和图像中提取的相同EventName和EventPhoto。在表格视图中,基本上有2个事件完全相同显示,这是我遇到的麻烦,因为我看不到代码两次在任何地方调用 init ,并且无法确定阐明为什么实例被创建两次。创建后,这两个实例将独立运行并像两个单独的实例一样起作用。

谢谢!

1 个答案:

答案 0 :(得分:0)

谢谢您的帮助,我在TableViewController的代码文件中发现了这个问题:

@IBAction func unwindToEventList(sender: UIStoryboardSegue){

    if let sourceViewController = sender.source as?
        NewEventViewController, let event = sourceViewController.event{

        if let selectedIndexPath = tableView.indexPathForSelectedRow {
        events[selectedIndexPath.row] = event
            tableView.reloadRows(at: [selectedIndexPath], with: .none)
        }  else  {
       //Adding a new event instead of editing it.
            let newIndexPath = IndexPath(row: events.count, section: 0)

            events.append(event)
            tableView.insertRows(at: [newIndexPath], with: .automatic)

        }
        //let newIndexPath = IndexPath(row: events.count, section: 0)

    //events.append(event)
        //tableView.insertRows(at: [newIndexPath], with: .automatic)
    }
    }

事实证明,我在 if 语句之外花了额外的时间不小心将实例附加到列表事件中,并将其插入到表中。