通过segue

时间:2016-11-21 12:35:50

标签: ios swift segue viewcontroller

我有一个MapViewController方法,我打算使用prepareForSegue(_:sender:)方法将数据发送到LandmarkTableViewController,并在按下按钮时调用。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        let destinationvc = segue.destinationViewController
        if let landmarkvc = destinationvc as? LandmarkTableViewController {
            if let identifier = segue.identifier {

                let library = Landmark(name: "Run Run Shaw Library", properties: ["Chinese Kanji", "Gray", "Green Plants"])

                let bank = Landmark(name: "Hang Seng Bank", properties: ["Chinese Kanji", "Green"])

                switch identifier {
                    case "showLibrary" : landmarkvc.passedLandmark = library // pass data to LandmarkTableViewController
                    case "showBank" : landmarkvc.passedLandmark = bank // pass data to LandmarkTableViewController
                    default : break
                }
            }
        }
    }

LandmarkTableViewController已正确设置为显示字符串数组properties,每行有一个字符串。所以我打算做的是根据按下的按钮将表格的相应数据传递给properties,让LandmarkTableViewController显示相应的properties

class LandmarkTableViewController: UITableViewController {
    var properties = [String]()
    var passedLandmark = Landmark(name: "temp", properties: ["temp"]) // initially set to default value

    override func viewDidLoad() {
        super.viewDidLoad()

        loadSampleProperties()
    }

    func loadSampleProperties() {
        self.properties = passedLandmark!.properties
    }
    // other methods....
}

class Landmark {
    var name: String
    var properties: [String]

    init?(name: String, properties: [String]) {
        self.name = name
        self.properties = properties

        // Initialization should fail if there is no name or if there is no property.
        if name.isEmpty || properties.isEmpty {
            return nil
        }
    }

但是,当我运行代码时,表视图中只显示temp。我已经坚持了很长时间了,所以任何帮助都非常感谢!

编辑: viewDidLoad()内的loadData()更改为正确的loadSampleProperties()。在将问题发布到问题时我犯了一个错误。

2 个答案:

答案 0 :(得分:0)

我认为如果不仔细检查您的标识符,这应该可以解决您的问题 并且您可以确保通过向viewDidLoad()或断点添加print(passedLandmark)以确保获取数据来传递数据

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)        {
    let destinationvc = segue.destinationViewController
    if let landmarkvc = destinationvc as? LandmarkTableViewController {
        if segue.identifier == "showLibrary" {

            let library = Landmark(name: "Run Run Shaw Library", properties: ["Chinese Kanji", "Gray", "Green Plants"])
              landmarkvc.passedLandmark = library
        }
        if segue.identifier == "showBank" {
            let bank = Landmark(name: "Hang Seng Bank", properties: ["Chinese Kanji", "Green"])
            landmarkvc.passedLandmark = bank
        }
    }
}

希望这会有所帮助

答案 1 :(得分:0)

您的引用中缺少代码,因此我无法确定,但我认为您的loadData()方法是使用您在prepareForSegue中传递的Landmark重新加载表视图数据的方法。如果是这样的话:

viewDidLoad()在 prepareForSegue之前被称为,因此destinationViewController的所有视图和元素都已加载并可供使用。因此,在您的情况下,表视图将加载您的“临时”数据,并且当您设置正确的数据时,没有任何内容可以重新加载。

您有两种选择: 例如,您可以在viewWillAppear中调用loadData()/ reloadData(),这在prepareForSegue()之后调用。请记住,viewWillAppear可能会在其他导航中再次被调用。 否则,您可以在父视图控制器中实例化并显示/推送新控制器,而不是使用segue。