【问题标题】:Data is persisting on an old view when new information should be on it - Swift当新信息应该放在旧视图上时,数据会保留在旧视图上 - Swift
【发布时间】:2018-03-22 17:07:21
【问题描述】:

我在选择UITableViewCell 时遇到了一个非常有趣的问题。目前我正在尝试将一个数组从我的主 ViewController 传递到辅助 ViewController。我第一次启动我的应用程序并在我的UITableView 中选择一个单元格时,一切都完美加载,但是当我第二次选择另一个单元格时,来自旧单元格的信息似乎一直存在,直到我再次返回并选择单元格第二次。

这是我的第一个 ViewController 中处理信息传递的函数

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
{
    self.selectedRow = indexPath.row
    print("The current row is: ", self.selectedRow)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
    let nextViewController = segue.destination as! SelectedEventViewController

    nextViewController.recievedArray = [self.eventArrayData[self.selectedRow]]
}

这是接收信息的视图控制器

class SelectedEventViewController: UIViewController
{
    @IBOutlet weak var mapView: GMSMapView!
    @IBOutlet weak var recHost: UILabel!
    @IBOutlet weak var recStatus: UILabel!
    @IBOutlet weak var recPrice: UILabel!
    @IBOutlet weak var recAddress: UILabel!
    @IBOutlet weak var recTown: UILabel!

    var recievedArray: Array = [eventStruct]()

    override func viewDidLoad()
    {
        super.viewDidLoad()

        self.loadData()
    }

    func loadData()
    {
        let camera = GMSCameraPosition.camera(withLatitude: self.recievedArray[0].eventLat, longitude: self.recievedArray[0].eventLong, zoom: 15)
        self.mapView.camera = camera

        let marker = GMSMarker()
        marker.position = CLLocationCoordinate2D(latitude: 0.0, longitude: 0.0)
        marker.title = self.recievedArray[0].eventHost
        marker.map = self.mapView

        recHost.text = self.recievedArray[0].eventHost

        self.title = self.recievedArray[0].eventHost
    }

}

任何帮助将不胜感激!

【问题讨论】:

    标签: ios arrays iphone uitableview uinavigationcontroller


    【解决方案1】:

    您直接从情节提要中行的action 出口触发segue,结果是在调用didSelectRowAt 函数之前启动segue,结果self.selectedRow 包含旧行prepare(for:) 被调用。

    您可以在prepare(for:) 中使用indexPathForSelectedRow 属性,然后您不需要实现didSelectRowAt:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
        let nextViewController = segue.destination as! SelectedEventViewController
        if let indexPath = tableView.indexPathForSelectedRow {
            let selectedRow = indexPath.row
            nextViewController.recievedArray = [self.eventArrayData[selectedRow]]
        }
    }
    

    【讨论】:

    • 刚刚试用了建议的代码,我似乎收到“对成员 'tableView(_:numberOfRowsInSection:)' 的模糊引用”
    • 您的{}平衡可能有误
    • 刚刚检查过,但 { } 的平衡似乎没有任何问题
    • 好吧,我的代码中没有任何引用 numberOfRowsInSection 所以,您在某个地方遇到了问题,该错误消息通常是由 {} 问题或类似问题引起的
    • 我通过在 tableView 前面添加 self 解决了这个问题,因为 @IBOutlet 存储在我的类中而不是函数中。现在,当我尝试在表格中选择一个单元格Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 时,我似乎遇到了一个新错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多