2016-07-03 49 views
0

我試圖顯示來自錶行的細節到另一個viewController,有三個實體,我想在第二個VC上顯示。兩個UILabel和一個UIImageView。雖然在第一個VC中我可以查看,但在第二個VC中,它表示'Optional(「」)',並且不知道如何解開它。從UITableView更改視圖控制器時顯示可選值'nil'

import UIKit 


class ViewController: UIViewController, UITextFieldDelegate, UITableViewDelegate,UITableViewDataSource, UICollectionViewDataSource, UICollectionViewDelegate { 

@IBOutlet var nameForUser: UITextField! 
@IBOutlet var loginButton: UIButton! 

@IBOutlet var tableView: UITableView! 




let allEvents = Events.allEvents 
var nextScreenRow: Events! 



override func viewDidLoad() { 
    super.viewDidLoad() 
    //nameForUser.text! = "Please Enter Name Here" 
    // Do any additional setup after loading the view, typically from a nib. 

    //let userName = nameForUser.text 

} 

func textFieldDidBeginEditing(textField: UITextField) { 
    textField.text = "" 
} 



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

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

    let cell = tableView.dequeueReusableCellWithIdentifier("eventsCell")! 
    let event = self.allEvents[indexPath.row] 
    //print(" row \(indexPath.row)") 

    cell.textLabel?.text = event.eventName 
    cell.imageView?.image = UIImage(named: event.imageName) 
    cell.detailTextLabel?.text = event.entryType 
    //cell.textLabel?.text = allEvents[indexPath.row] 

    return cell 
} 

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


    nextScreenRow = allEvents[indexPath.row] 

    let view : DetailedEventViewController = self.storyboard?.instantiateViewControllerWithIdentifier("trytry") as! DetailedEventViewController 
    self.navigationController?.pushViewController(view, animated: true) 

    print("Selected section \(indexPath.section), row \(indexPath.row)") 
    print(nextScreenRow.eventName) 

    view.eventDetails = nextScreenRow.eventName 
    print(view.eventDetails) 

    view.typeOfEvent = nextScreenRow.entryType 
    view.myImage = UIImage(named: nextScreenRow.imageName) 
    //even the 'print' is used, it is displaying here, but not in the next VC 

} 

func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 
    return true 
} 

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return self.allEvents.count 
} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let sec = collectionView.dequeueReusableCellWithReuseIdentifier("eventsSec", forIndexPath: indexPath) as! GridCollectionViewCell 

    let event = self.allEvents[indexPath.row] 

    sec.imageView.image = UIImage(named: event.imageName) 

    sec.caption.text = event.entryType 

    return sec 
} 
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
    performSegueWithIdentifier("tryToConnect2", sender: self) 
} 






override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if (segue.identifier == "successfulLogin"){ 
     segue.destinationViewController as! TabController 
     //let userName = nameForUser.text 
     //controller.userName = userName 

    } 

} 



@IBAction func loginButtonWhenPressed(sender: UIButton) { 
    let userName = nameForUser.text 

    if userName == "" { 
     let nextController = UIAlertController() 
     nextController.title = "Error!" 
     nextController.message = "Please enter a name" 

     let okAction = UIAlertAction(title: "okay", style: UIAlertActionStyle.Default) { 
      action in self.dismissViewControllerAnimated(true, completion: nil) 
     } 

     nextController.addAction(okAction) 
     self.presentViewController(nextController, animated: true, completion: nil) 
    } 
} 

}

這裏是我的第二個VC:

import UIKit 

class DetailedEventViewController: UIViewController { 

@IBOutlet weak var imageView: UIImageView! 
@IBOutlet weak var deatiledEvent: UILabel! 
@IBOutlet weak var eventType: UILabel! 

var eventDetails = "" 
var typeOfEvent = "" 
var myImage: UIImage? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 

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

@IBAction func viewTheElemnts(sender: AnyObject) { 

    deatiledEvent.text = eventDetails 
    print(deatiledEvent.text) 

    eventType.text = typeOfEvent 
    imageView.image = myImage 
} 

} 

幫助將不勝感激。謝謝。

+0

如果您不需要這些註釋並且可以縮短您發佈到最相關部分的代碼量,那麼您可以從代碼中刪除註釋嗎? – Dopapp

+0

我已編輯它,在'didSelectRowAtIndexPath'中有問題。謝謝。 –

+0

@ shravan.sukumar:我不明白你面臨的問題?你有沒有叫過'viewTheElements:'IBAction?您是否使用該方法獲取了正確的數據? –

回答

0

您在didSelectRowAtIndexPath創造DetailedEventViewController一個實例並將其值設置在那裏。但實際上你正在使用segue移動到DetailedEventViewController。所以你應該在prepareForSegue:方法中添加這些值。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
{ 
    if (segue.identifier == "trytry") 
    { 
     let selectedIndex = self.tableView.indexPathForCell(sender as! UITableViewCell) 
     nextScreenRow  = allEvents[selectedIndex.row] 
     let view   = segue.destinationViewController as! DetailedEventViewController  
     view.eventDetails = nextScreenRow.eventName 
     view.typeOfEvent = nextScreenRow.entryType 
     view.myImage  = UIImage(named: nextScreenRow.imageName) 
    } 
} 
+0

之後,你要求我在'prepareForSegue'方法時,顯示'致命錯誤:無找到wile解包可選' –

+0

@ shravan.sukumar:在哪一行你會得到這個崩潰? –

+0

該行'view.eventDetails = nextScreenRow.eventName' –

0

解開你的eventName的是這樣的:

view.eventDetails = nextScreenRow.eventName! as String 
print(view.eventDetails) view.typeOfEvent = nextScreenRow.entryType 
view.myImage = UIImage(named: nextScreenRow.imageName) 
self.navigationController?.pushViewController(view, animated: true 
+0

仍然沒有工作,它在運行框中顯示'可選(「」)'。 –

相關問題