2015-11-27 3 views
1

Когда выбрана ячейка таблицы, я пытаюсь перейти к контроллеру представления, если значение логического значения истинно, иначе (если оно ложно), перейдите к другому представлению контроллер. Любая помощь будет замечательной! (Булева является IsAdmin и если верно перейти к eventViewController, иначе перейти к UserEventTableViewController)Перейдите к различным контроллерам представлений на основе логического значения

ссылка на проект: https://www.dropbox.com/s/1d4d8opuxzpcuk4/TicketekApp.zip?dl=0

Код:

import UIKit 

class EventTableViewController: UITableViewController { 
// MARK: Properties 

var events = [Event]() 
var isAdmin = false 
override func viewDidLoad() { 
    super.viewDidLoad() 

    // Use the edit button item provided by the table view controller. 
    navigationItem.leftBarButtonItem = editButtonItem() 

    // Load any saved events, otherwise load sample data. 
    if let savedEvents = loadEvents() { 
     events += savedEvents 
    } else { 
     // Load the sample data. 
     loadSampleEvents() 
    } 
} 

func loadSampleEvents() { 
    let photo1 = UIImage(named: "event1")! 
    let event1 = Event(name: "ACDC", photo: photo1, rating: 4, price: 500.0, eventDescription: "Album", album: "Album1")! 

    let photo2 = UIImage(named: "event2")! 
    let event2 = Event(name: "Cold Play", photo: photo2, rating: 5, price: 500.0, eventDescription: "Album", album: "Album1")! 

    let photo3 = UIImage(named: "event3")! 
    let event3 = Event(name: "One Direction", photo: photo3, rating: 3, price: 500.0, eventDescription: "Album", album: "Album1")! 

    events += [event1, event2, event3] 
} 

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

// MARK: - Table view data source 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    // Table view cells are reused and should be dequeued using a cell identifier. 
    let cellIdentifier = "EventTableViewCell" 
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! EventTableViewCell 

    // Fetches the appropriate event for the data source layout. 
    let event = events[indexPath.row] 

    cell.nameLabel.text = event.name 
    cell.photoImageView.image = event.photo 
    cell.ratingControl.rating = event.rating 
    cell.priceLabel.text = event.album 

    return cell 
} 

// Override to support conditional editing of the table view. 
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
    // Return false if you do not want item to be editable. 
    return true 
} 


// Override to support editing the table view. 
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 
    if editingStyle == .Delete { 
     // Delete the row from the data source 
     events.removeAtIndex(indexPath.row) 
     saveEvents() 
     tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) 
    } else if editingStyle == .Insert { 
     // Create new instance of class, add to the array, and add a new row to the table 
    } 
} 


/* 
// Override to support rearranging the table view. 
override func tableView(tableView: UITableView, moveRowAtIndexPath fromIndexPath: NSIndexPath, toIndexPath: NSIndexPath) { 

} 
*/ 

/* 
// Override to support conditional rearranging of the table view. 
override func tableView(tableView: UITableView, canMoveRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
// Return false if you do not want the item to be re-orderable. 
return true 
} 
*/ 


// MARK: - Navigation 

// preparation before navigation 
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "ShowDetail" { 
     let eventDetailViewController = segue.destinationViewController as! EventViewController 

     // Get the cell that generated this segue. 
     if let selectedEventCell = sender as? EventTableViewCell { 
      let indexPath = tableView.indexPathForCell(selectedEventCell)! 
      let selectedEvent = events[indexPath.row] 
      eventDetailViewController.event = selectedEvent 
      print(selectedEventCell) 
     } 
    } 
    else if segue.identifier == "AddItem" { 
     print("Adding new event.") 
    } 
} 


@IBAction func unwindToMealList(sender: UIStoryboardSegue) { 
    if let sourceViewController = sender.sourceViewController as? EventViewController, event = sourceViewController.event { 
     if let selectedIndexPath = tableView.indexPathForSelectedRow { 
      // Update an existing event. 
      events[selectedIndexPath.row] = event 
      tableView.reloadRowsAtIndexPaths([selectedIndexPath], withRowAnimation: .None) 
     } else { 
      // Add a new event. 
      let newIndexPath = NSIndexPath(forRow: events.count, inSection: 0) 
      events.append(event) 
      tableView.insertRowsAtIndexPaths([newIndexPath], withRowAnimation: .Bottom) 
     } 
     // Save the events. 
     saveEvents() 
    } 
} 

// MARK: NSCoding 

func saveEvents() { 
    let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(events, toFile: Event.ArchiveURL.path!) 
    if !isSuccessfulSave { 
     print("Failed to save events...") 
    } 
} 

func loadEvents() -> [Event]? { 
    return NSKeyedUnarchiver.unarchiveObjectWithFile(Event.ArchiveURL.path!) as? [Event] 
} 
} 
+0

'prepareForSegue' слишком поздно, чтобы изменить SEGUE; Вам нужно связать вам segues из объекта UIViewController в вашей сцене, а затем реализовать 'didSelectRowAtIndexPath' - в этом методе вы можете использовать' performSegueWithIdentifier', чтобы вызвать желаемый сегмент, основываясь на любой логике, в которой вы нуждаетесь. – Paulw11

ответ

0

Вы должны реализовать метод делегата Tableview didSelectRowAtIndexPath.

пример следующим образом:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    let index = self.tableView.indexPathForSelectedRow?.row 
    //use the index to know which cell you selected 

    //check for your condition here something like 
    if isAdmin { 
     performSegueWithIdentifier("eventViewControllerSegue", sender: self) 
    } else { 
     performSegueWithIdentifier("userEventTableViewControllerSegue", sender: self) 
    } 
} 

обратите внимание на следующее:

  1. В вашей раскадровку, рисовать перетекает к различным контроллерам зрения и назначить SEGUE ID соответственно.

  2. В коде вы не меняете значение isAdmin boolean. Проверьте это тоже.

С уважением.

Изображение о том, как непосредственно перейти от ViewController для справки enter image description here

+0

Извините, новичок, но я бы рисовал segues на новый контроллер представления при нажатии на ячейку таблицы и будет ли это выбор аксессуаров? – qwertyAV

+0

Я считаю, что вы можете видеть аксессуар только тогда, когда вы рисуете segue из вашего TableViewCell в destinationViewController. В идеале вы должны нарисовать вручную segues от sourceViewController до destinationViewController – PK20

+0

Большое вам спасибо! Оно работает! – qwertyAV

0

Я считаю, что вы можете сделать то, что вы ищете используя tableView:didSelectRowAtIndexPath: из протокола UITableViewDelegate.

Добавьте к этому контроллеру вид

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

и обрабатывать свою логику в этой функции.

Когда вы будете готовы перейти к следующему контроллеру представления, используйте

performSegueWithIdentifier(identifier: String, sender: AnyObject?) 

Вот пример:

if isAdmin { 
    performSegueWithIdentifier(identifier: "segueToAdminView", sender: self) 
} else { 
    performSegueWithIdentifier(identifier: "segueToUserEventView", sender: self) 
} 
Смежные вопросы