ios - 无法在 Swift 中的 TableView 的另一个 View Controller 中显示值

标签 ios swift uitableview

我想将一个表格行的详细信息显示到另一个 viewController 上。但它显示一条错误消息,提示“ fatal error :在展开可选值时意外发现 nil”

我的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.



}

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]

    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) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)

    nextScreenRow = allEvents[indexPath.row]

    performSegueWithIdentifier("tryToConnect", sender:self)

}

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

    }

    else if (segue.identifier == "tryToConnect"){
            let dest = segue.destinationViewController as! DetailedEventViewController
            dest.deatiledEvent.text = nextScreenRow.eventName
            dest.eventType.text = nextScreenRow.entryType
            dest.imageView.image = UIImage(named: nextScreenRow.imageName)
            }


}



@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)
    }
}  

}

当我运行它时,它显示错误。我还为 TableView 分配了代表。 “DetailedEventVC”的代码是:

import UIKit

class DetailedEventViewController: UIViewController {

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


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.
}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    // Get the new view controller using segue.destinationViewController.
    // Pass the selected object to the new view controller.
}
*/

}

为什么显示值为nil? 帮助将不胜感激。 提前致谢。 包含事件详细信息的“EventsDetails.swift”文件是一个结构。我调用这些值的方式有什么问题吗?

import Foundation
import UIKit

struct Events {
let eventName: String
let entryType: String
let imageName: String

static let EventKey = "NameKey"
static let EntryTypeKey = "EntryType"
static let ImageNameKey = "ImageNameKey"

init(dictionary:[String : String]) {
    self.eventName = dictionary[Events.EventKey]!
    self.entryType = dictionary[Events.EntryTypeKey]!
    self.imageName = dictionary[Events.ImageNameKey]!
}
}

extension Events {

static var allEvents: [Events] {

    var eventsArray = [Events]()

    for d in Events.localEventsData(){
        eventsArray.append(Events(dictionary: d))
    }

    return eventsArray
}

static func localEventsData()-> [[String: String]] {

    return [

        [Events.EventKey:"Metallica Concert in Palace Grounds", Events.EntryTypeKey: "Paid Entry", Events.ImageNameKey:"Metallica"],
        [Events.EventKey:"Saree Exhibition in Malleswaram Grounds", Events.EntryTypeKey: "Free Entry", Events.ImageNameKey:"SareeExhibition"],
        [Events.EventKey:"Wine tasting event in Links Brewery", Events.EntryTypeKey: "Paid Entry", Events.ImageNameKey:"WineTasting"],
        [Events.EventKey:"Startups Meet in Kanteerava Stadium", Events.EntryTypeKey: "Paid Entry", Events.ImageNameKey:"StartupMeet"],
        [Events.EventKey:"Summer Noon Party in Kumara Park", Events.EntryTypeKey: "Paid Entry", Events.ImageNameKey:"SummerNoonParty"],
        [Events.EventKey:"Rock and Roll nights in Sarjapur Road", Events.EntryTypeKey: "Paid Entry", Events.ImageNameKey:"RockNRollNight"],
        [Events.EventKey:"Barbecue Fridays in Whitefield", Events.EntryTypeKey: "Paid Entry", Events.ImageNameKey:"BBQFriday"],
        [Events.EventKey:"Summer workshop in Indiranagar", Events.EntryTypeKey: "Free Entry", Events.ImageNameKey:"SummerWorkshop"],
        [Events.EventKey:"Impressions & Expressions in MG Road", Events.EntryTypeKey: "Free Entry", Events.ImageNameKey:"ImpressionAndExpression"],
        [Events.EventKey:"Italian carnival in Electronic City", Events.EntryTypeKey: "Free Entry", Events.ImageNameKey:"ItalianCarnival"]

    ]
}
}

最佳答案

在目标 viewController 中创建属性并像下面那样使用它们

import UIKit

class DetailedEventViewController: UIViewController {

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var deatiledEvent: UILabel!
@IBOutlet weak var eventType: UILabel!
var myImage = UIImage?
var eventDetails = ""
var typeOfEvent = ""

override func viewDidLoad() {
super.viewDidLoad()
imageView.image = myImage
deatiledEvent.text = eventDetails
eventType.text = typeOfEvent
// Do any additional setup after loading the view.
}

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

然后在您的第一个 viewController 中,您可以访问它们

let dest = segue.destinationViewController as! DetailedEventViewController
        dest.eventDetails = nextScreenRow.eventName
        dest.typeOfEvent = nextScreenRow.entryType
        dest.myImage = UIImage(named: nextScreenRow.imageName)

关于ios - 无法在 Swift 中的 TableView 的另一个 View Controller 中显示值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38169089/

相关文章:

ios - 如何在 Objective-C 中使用 "copy"属性?

ios - 带有自定义 UIView 的 UITableView header 在 3. 5'' 和 4'' 屏幕(自动布局)中的行为不同

ios - 如何允许用户每 "n"秒刷新一次表?

iphone - 将FirstResponder 重新分配给不再出现在屏幕上的UITableViewCell 上的UITextView

ios - 在 iPhone 上将整个 pdf 页面解析为 NSString

ios - 如何让UIImage边缘更柔和?

iphone - 在 iPhone 模拟器上点击菜单按钮然后重新启动应用程序后,有没有办法查看日志记录?

ios - 替换 Swift 3 中的 enumerateSubstringsInRange

swift - 如何在后台广播蓝牙信号,然后在 Swift 中运行前台时发现该设备?

iOS 10 和为属性文本设置自定义字体