2015-04-21 2 views
0

Я новичок в Swift и IOS, у меня был обычный вид стола, и все сработало. Я теперь внедрил ячейку представления пользовательской таблицы и задался вопросом, как реализовать мой метод PrepareForSegue с помощью моего UITableView. Я хочу, чтобы иметь возможность отправить выбранный индекс ячейки таблицы в segue для следующего контроллера для доступа к определенной позиции массива. В настоящий момент объект-отправитель является объектом CustomCell: UITableViewCell. могу ли я получить доступ к индексу таблицы от этого объекта или каким-либо другим способом?Segue из пользовательских данных Cell in Swift

// 
// ViewController.swift 
// OBU Bus Tracker 
// 
// Created by AJ Norton on 4/20/15. 
// Copyright (c) 2015 AJ Norton. All rights reserved. 
// 

import UIKit 

class ViewController: UIViewController, UITableViewDelegate { 

    @IBOutlet var table: UITableView! 

    var locations = [String]() 
    var overall = Dictionary<String, AnyObject>() 

    override func viewDidLoad() { 
     super.viewDidLoad() 



     // check if the user is running the app for the first time 
     //  if let firstTime = NSUserDefaults.standardUserDefaults().objectForKey("firstTime") 
     //  { 
     // 
     //   println("second time") 
     //  } 
     //  else 
     //  { 
     //   println("worked") 
     //   NSUserDefaults.standardUserDefaults().setBool(true, forKey: "firstTime") 
     //  } 

     if let path = NSBundle.mainBundle().pathForResource("busSchedule", ofType: "plist") 
     { 
      if let dict = NSDictionary(contentsOfFile: path) as? Dictionary<String, AnyObject> 
      { 
       locations = dict.keys.array 
       overall = dict 
      } 
     } 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

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


    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 

     return locations.count 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 

     let cell: CustomRouteViewCell = table.dequeueReusableCellWithIdentifier("Cell") as! CustomRouteViewCell 

     cell.locationTitle.text = "\(locations[indexPath.row])" 


     return cell 
    } 



    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     println("I was clicked") 
     performSegueWithIdentifier("routeToTime", sender: indexPath.row) 

    } 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     //TODO 
     println("\(sender?.integerValue)") 
     if segue.identifier == "routeToTime" 
     { 
      var ttvc = segue.destinationViewController as! TimeViewController 
      var s = sender as! CustomRouteViewCell 
      println("\(s.in)") 
      var place = s.indentationLevel as! Int 
      var dicts = overall[locations[place]] as! Dictionary<String,AnyObject> 
      var arr = dicts["Weekday"] as! [Int] 

      ttvc.days = dicts 
      ttvc.times = arr.reverse() 
     } 
    } 






} 
+0

Является ли ваш segue из ячейки или контроллера? Похоже, что это из ячейки, если отправитель является ячейкой, но в этом случае вы не должны вызывать функцию выполнения в didSelectRowAtIndexPath (на самом деле вам вообще не нужно реализовывать этот метод). – rdelmar

+0

Это неизвестно. Я не знаю, где делается segue. Его больше не вызывают в моем методе prepareForSegue. Я не знаю, где зовут segue. – applejuiceteaching

+0

Разве вы не сделали сегу? Вы перетащили из ячейки или из значка контроллера, когда вы это сделали? – rdelmar

ответ

-1

Как насчет хранения индекса ячейки как NSUserDefault и получения его с другой стороны?

Таким образом, вы можете использовать общий набор, созданный с помощью раскадровки, реализовать ячейки таблицы для выбранной функции.

+0

Нет такой вещи, как NSdefault. Если вы имеете в виду NSUserDefaults, это плохая идея; это не то, для чего они предназначены. OP должен научиться правильно передавать данные в prepareForSegue, а не использовать NSUserDefaults в качестве костыля. – rdelmar

1
performSegueWithIdentifier("routeToTime", sender: indexPath.row) 

Вызов выше способ. так что в этом методе:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 

местный отправитель аргумент indexPath.row, НЕ является экземпляром CustomRouteViewCell.

Таким образом, вы можете написать код:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "routeToTime" 
    { 
     var ttvc = segue.destinationViewController as! TimeViewController 
     var place = sender as! Int 
     var dicts = overall[locations[place]] as! Dictionary<String,AnyObject> 
     var arr = dicts["Weekday"] as! [Int] 

     ttvc.days = dicts 
     ttvc.times = arr.reverse() 
    } 
} 

Лучше писать код в Паттен MVC, поэтому не храните данные в Tableview ячейке.

Если вы хотите это сделать, вы должны установить свойство ячейки (например: rowIndex: Int), которые указывают indexRow данных в этом методе «func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath)». Ваш код выглядит следующим образом:

if segue.identifier == "routeToTime" 
    { 
     var ttvc = segue.destinationViewController as! TimeViewController 
     var cell = sender as! CustomRouteViewCell 
     var place = cell.indexRow 
     var dicts = overall[locations[place]] as! Dictionary<String,AnyObject> 
     var arr = dicts["Weekday"] as! [Int] 

     ttvc.days = dicts 
     ttvc.times = arr.reverse() 
    } 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 

    let cell: CustomRouteViewCell = table.dequeueReusableCellWithIdentifier("Cell") as! CustomRouteViewCell 

    cell.locationTitle.text = "\(locations[indexPath.row])" 
    cell.indexRow = ... //Set the index of cell's data. 

    return cell 
} 

Кстати, свойство indentationLevel является:

вар indentationLevel: Int // настроить отступы содержимого. по умолчанию 0