textLabel?.text отображает только "Метку", но не фактические данные, переданные из предыдущего представления таблицы

Чего я хочу достичь: я хочу нажать на одну из строк в моем первом контроллере представления, чтобы перейти к другому контроллеру представления таблицы.

Проблема: когда я щелкаю по строке, в представлении отображается только "Метка", а не данные, которые я собираюсь передать. Конечно, приложение не падает, и отображается белый фон с заголовком "Метка", данные все еще не отображаются на контроллере второго представления.

Что я сделал так: ffar: я использовал Struct: PageTwoItems для определения данных, которые я хочу отправить во 2-й контроллер представления.

import Foundation
import UIKit

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

class PageTwoTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!

var PageTwo = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
}

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

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let Cell = self.tableView.dequeueReusableCellWithIdentifier("secondcell", forIndexPath: indexPath) as UITableViewCell

   Cell.textLabel?.text = PageTwo[indexPath.row]

    return Cell
}

}

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

@IBOutlet weak var tableView: UITableView!

let names = ["Cleaning", "Plumbing","Electrical", "Craftswork", "Automotive"]

let desc = ["Get your spotless home or office space", "Drains, Pipes, Faucets and more", "Lighting, Fans, AC's and more", "Installation, Assembly and more", "Tow Truck Hire, Tyre Replacement and more"]
let images = [UIImage(named:"pug"),UIImage(named:"pug2"),UIImage(named:"pug3"),UIImage(named:"pug4"),UIImage(named:"pug5")]

var PageTwo = [PageTwoItems]()


override func viewDidLoad() {

    PageTwo = [PageTwoItems(nametwo:["Home Cleaning", "Office Cleaning", "Moving In/Out Cleaning"], summarytwo:["Let your home sparkle","Office space cleaning right at your fingertips","New Home or Old Home? We've got you covered"],phototwo:["","",""]),
        PageTwoItems(nametwo:["Drains, Pipes & Faucets", "Showers and Bath Tubs", "Toilet and Wash Basin", "Water Heater"], summarytwo:["Fix Your Broken Pipes, Clogged Drains and Leaky Faucets","Showers and Bath Tubs working just right"," ", " "],phototwo:["","",""]),
        PageTwoItems(nametwo:["Lighting Fixtures", "Air Conditioners & Fans", "Generators"], summarytwo:["..","..",".."],phototwo:["","",""]),
        PageTwoItems(nametwo:["Furniture Assembly/Installation", "Interior Painting", "Doors, Windows & Curtains"], summarytwo:["..","...","..."],phototwo:["","",""]),
        PageTwoItems(nametwo:["Tow Truck Hire", "Tyre/Vulcanizer Help", "Auto-Consultant"], summarytwo:["...","...","..."],phototwo:["","",""])]



    super.viewDidLoad()

}

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

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

    return 5

}

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

    let cell = self.tableView.dequeueReusableCellWithIdentifier("newcell", forIndexPath:indexPath) as!CustomCell

    cell.photo.image = images[indexPath.row]
    cell.summary.text = desc[indexPath.row]
    cell.name.text = names[indexPath.row]

    return cell
}

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

    let indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow!

    let DestViewController = segue.destinationViewController as! PageTwoTableViewController

    var PageTwoArrayTwo : PageTwoItems

    PageTwoArrayTwo = PageTwo[indexPath.row]

    DestViewController.PageTwo = PageTwoArrayTwo.nametwo
    DestViewController.PageTwo = PageTwoArrayTwo.summarytwo
    DestViewController.PageTwo = PageTwoArrayTwo.phototwo

}

}

The struct for the Page Two Items: 

struct PageTwoItems {
    var nametwo : [String]
    var summarytwo : [String]
    var phototwo : [String]
}

2 ответа

Решение

Я думаю, что ваши данные не организованы правильно. Я думаю, что вы ищете что-то вроде этого:

  1. очищающий

    • Уборка дома
    • Уборка офиса
    • Так далее
  2. водопровод

    • Водостоки, трубы и смесители
    • Душевые и ванны
    • Так далее
  3. электрический

    • Осветительная арматура
    • Кондиционеры и вентиляторы
    • Генераторы

Вот как я хотел бы создать структуры данных для поддержки этого.

// This represents a single row on the detail screen
struct PageTwoItem {
    var name : String
    var summary : String
    var photo : String
}
// this represents a single row on the main screen
struct PageData {
    var name: String            // goes into the table on main screen
    var subitems: [PageTwoItem] // send this to the detail
}

class MasterViewController: UITableViewController {

    var detailViewController: DetailViewController? = nil
    // Make an array of PageData
    var objects = [PageData]()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        setupData()
    }


    func setupData() {
        objects = [
            PageData(name: "Cleaning", subitems: [
                PageTwoItem(name: "Cleaning 1", summary: "", photo: ""),
                PageTwoItem(name: "Cleaning 2", summary: "", photo: ""),
                PageTwoItem(name: "Cleaning 3", summary: "", photo: ""),
                PageTwoItem(name: "Cleaning 4", summary: "", photo: "")
                ] ),
            PageData(name: "Plumbing", subitems: [] ),
            PageData(name: "Electrical", subitems: [] ),
            PageData(name: "Craftswork", subitems: [] ),
            PageData(name: "Automotive", subitems: [] ),
        ]
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        print(segue.identifier)
        if segue.identifier == "showDetail" {
            if let indexPath = self.tableView.indexPathForSelectedRow {
                let object = objects[indexPath.row]
                let controller = segue.destinationViewController as! DetailViewController
                // tell the detail controller what we want her to show
                controller.detailItem = object
            }
        }
    }

    // MARK: - Table View

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

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

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

        let object = objects[indexPath.row]
        cell.textLabel!.text = object.name
        return cell
    }


}

В подробном контроллере:-

импорт UIKit

class DetailViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    @IBOutlet weak var tableView: UITableView!
    // here is where we put the data we want to show
    var detailItem: PageData?

    // MARK: - Table View

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

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if let detailItem = detailItem {
            print("count = \(detailItem.subitems.count)")
            return detailItem.subitems.count
        }
        return 0

    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("DetailCell", forIndexPath: indexPath)

        if let object = detailItem?.subitems[indexPath.row] {
            cell.textLabel!.text = object.name
        }
        return cell
    }
}

Я думаю, что используемый вами переход напрямую связан с ячейкой tableview и вашим вторым контроллером view.

Вы должны соединить ваш переход между двумя вашими контроллерами и установить идентификатор для инспектора атрибутов, например showSecondControllerSegue, и использовать этот метод:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    performSegueWithIdentifier(identifier: "showSecondControllerSegue", sender: self)
}

Редактировать:-

Ваш код должен быть:

Для контроллера второго вида:

class PageTwoTableViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!

var pageTwo = [String]()

override func viewDidLoad() {
    super.viewDidLoad()
}

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

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

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let Cell = self.tableView.dequeueReusableCellWithIdentifier("secondcell", forIndexPath: indexPath) as UITableViewCell

   Cell.textLabel?.text = pageTwo[indexPath.row]

    return Cell
}
}

Для первого контроллера просмотра:

@IBOutlet weak var tableView: UITableView!

let names = ["Cleaning", "Plumbing","Electrical", "Craftswork", "Automotive"]

let desc = ["Get your spotless home or office space", "Drains, Pipes, Faucets and more", "Lighting, Fans, AC's and more", "Installation, Assembly and more", "Tow Truck Hire, Tyre Replacement and more"]
let images = [UIImage(named:"pug"),UIImage(named:"pug2"),UIImage(named:"pug3"),UIImage(named:"pug4"),UIImage(named:"pug5")]

var pageTwo = [PageTwoItems]()


override func viewDidLoad() {
    super.viewDidLoad()

    pageTwo = [PageTwoItems(nametwo:["Home Cleaning", "Office Cleaning", "Moving In/Out Cleaning"], summarytwo:["Let your home sparkle","Office space cleaning right at your fingertips","New Home or Old Home? We've got you covered"],phototwo:["","",""]),
        PageTwoItems(nametwo:["Drains, Pipes & Faucets", "Showers and Bath Tubs", "Toilet and Wash Basin", "Water Heater"], summarytwo:["Fix Your Broken Pipes, Clogged Drains and Leaky Faucets","Showers and Bath Tubs working just right"," ", " "],phototwo:["","",""]),
        PageTwoItems(nametwo:["Lighting Fixtures", "Air Conditioners & Fans", "Generators"], summarytwo:["..","..",".."],phototwo:["","",""]),
        PageTwoItems(nametwo:["Furniture Assembly/Installation", "Interior Painting", "Doors, Windows & Curtains"], summarytwo:["..","...","..."],phototwo:["","",""]),
        PageTwoItems(nametwo:["Tow Truck Hire", "Tyre/Vulcanizer Help", "Auto-Consultant"], summarytwo:["...","...","..."],phototwo:["","",""])]    
}

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

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

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

    let cell = self.tableView.dequeueReusableCellWithIdentifier("newcell", forIndexPath:indexPath) as!CustomCell

    cell.photo.image = images[indexPath.row]
    cell.summary.text = desc[indexPath.row]
    cell.name.text = names[indexPath.row]

    return cell
}

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    performSegueWithIdentifier(identifier: "showSecondControllerSegue", sender: self)
}

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

    let indexPath : NSIndexPath = self.tableView.indexPathForSelectedRow!

    let DestViewController = segue.destinationViewController as! PageTwoTableViewController

    var pageTwoArrayTwo : PageTwoItems

    pageTwoArrayTwo = PageTwo[indexPath.row]

    DestViewController.pageTwo = pageTwoArrayTwo.nametwo
    DestViewController.pageTwo = pageTwoArrayTwo.summarytwo
    DestViewController.pageTwo = pageTwoArrayTwo.phototwo

}
Другие вопросы по тегам