从UITableView更改viewController时,将可选值显示为“nil”

时间:2016-07-03 14:48:24

标签: ios swift uitableview uiviewcontroller uilabel

我正在尝试将表格行中的详细信息显示到另一个viewController上,我想在第二个VC上显示三个实体。两个UILabel和一个UIImageView。在我能够查看的第一个VC中,当在第二个VC中,它显示“可选(”“)”,并且不知道如何打开它。

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
}

}

非常感谢帮助。谢谢。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您正在DetailedEventViewController中创建didSelectRowAtIndexPath的实例,并在那里设置值。但实际上你正在使用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)
   }
}