Swift 重新加载UIViewController中的UITableView

Swift 重新加载UIViewController中的UITableView,swift,uitableview,Swift,Uitableview,我在学斯威夫特,今天我遇到了一个问题。我正在创建一个显示电影院及其时间表的应用程序。大概是这样的: 想法是有3个按钮可以显示剧院今天、第二天和第二天的日程安排(我不知道正确的词,抱歉:(),如果单击。例如,第一个按钮显示今天的日程安排: 第一次加载视图时,它总是显示今天的日程安排。但是其他按钮不起作用,我不知道为什么 我在UIViewController的viewDidLoad方法中获得了tableView的委托和数据源 这是操作函数。因为3个按钮具有相同的用途,所以我将它们全部连接到1个

我在学斯威夫特,今天我遇到了一个问题。我正在创建一个显示电影院及其时间表的应用程序。大概是这样的:

想法是有3个按钮可以显示剧院今天、第二天和第二天的日程安排(我不知道正确的词,抱歉:(),如果单击。例如,第一个按钮显示今天的日程安排:

第一次加载视图时,它总是显示今天的日程安排。但是其他按钮不起作用,我不知道为什么

我在
UIViewController
viewDidLoad
方法中获得了tableView的委托和数据源

这是操作函数。因为3个按钮具有相同的用途,所以我将它们全部连接到1个函数,我进行了测试,它们使用“获取按钮文本”方法工作良好

选择日期后,应用程序将抛出所选剧院的所有房间和每个房间中的所有节目,并选择与所选日期相同的每个节目,将其存储在列表中,然后返回全局变量shownDate:[show]

extension ShowtimeViewController: UITableViewDelegate, UITableViewDataSource {

// MARK: Showtime tableView lifecycle and settings

// Set number of section based on number of show performed on selected day
func numberOfSections(in tableView: UITableView) -> Int {
    return showOnDate.count
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "showtimeCell", for: indexPath) as! ShowtimeTableViewCell
    return cell
}

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    let cell = cell as! ShowtimeTableViewCell
    let dateTimeComponents = Calendar.current.dateComponents(dateComponents, from: showOnDate[indexPath.section].sDate)

    // Set cell image and labels based on shows of selected theater
    cell.showImage.image = showOnDate[indexPath.section].sFilm.fPoster
    cell.showName.text = "\(showOnDate[indexPath.section].sFilm.fName) (\(showOnDate[indexPath.section].sFilm.fYear))"
    cell.showTime.text = "\(dateTimeComponents.hour!):\(dateTimeComponents.minute!)"
}

// Get shows will be performed on selected date
func getShowList(date: Int) -> [Show] {
    var listShow = [Show]()
    for room in selectedTheater!.tRooms {
        for show in room.rShow {
            let dateTimeComponents = Calendar.current.dateComponents(dateComponents, from: show.sDate)
            if date == dateTimeComponents.day! {
                listShow += [show]
            }
        }
    }
    return listShow
}
}


我试图在action func中包含
showthedule.reloadData()
,但什么也没发生。我尝试了
DispatchQueue.main.async
beginUpdates()
endUpdates()
,但什么都没起作用(我尝试了我所知道的一切,所以可能没有任何影响)。现在我哭了,我需要帮助。非常感谢!(我没有足够的声誉来嵌入图像,抱歉:()

在按钮操作中,您需要使用与所选日期相关的显示更新
ShowOneDay
数组(如
viewDidLoad
),然后重新加载表视图。)

@IBAction func isClickedDate(_ sender: UIButton) {
    selectedDay = Int(sender.titleLabel!.text!)!
    showOnDate = getShowList(date: selectedDay)
    tableView.reloadData()
}

将(更多)代码作为文本发布的原因是,愿意提供帮助的人不一定愿意重新键入所有代码链接到按钮的操作除了更改
selectedDay
变量的值外,什么都不做

因此,我的问题是:您将以何种方式检索要在表视图中显示的元素?即,您能否显示数据源方法的实现

在这里,您可以使用不同的方法来实现它。一个简单的方法是基于该选择为
showOnDate
变量分配一个新列表,然后触发
reloadData
方法。如果您已经在主线程上运行,则不需要执行任何对main的分派。

样本:

@IBAction func isClickedDate(_ sender: UIButton) {
    selectedDay = Int(sender.titleLabel!.text!)!
    showOnDate = getShowList(selectedDay)
    tableView.reloadData()
}
注意:

我会避免使用这个代码

Int(sender.titleLabel!.text!)!
因为它很难看。也许(只是为了学习新东西)你可以使用
标签
属性来实现这一点。代码会变得更干净

button.tag = 22
button2.tag = 23
// etc


但是您有足够的声誉,可以将代码作为文本而不是图像@vadian发布。我认为图像会更容易理解…已编辑!您可以发布代码,说明如何设置TableView中使用的数据吗?现在您只更改selectedDay变量,但不清楚您对该变量做了什么。@hell2809您的按钮操作正在工作,但数据没有重新加载。这是您的问题吗???请在索引tooOMG处显示行的单元格!工作得像个冠军!!您是我的救世主!但我想知道为什么
shownDate=getShowList(日期:selectedDay)
viewDidLoad中的行不工作:(谢谢你,先生!在
viewDidLoad
中,你也必须添加
tableView.reloadData()
。每次数据源数组更改后都需要添加。搞定了!谢谢你的支持和建议。我对这一点还是新手,像你这样的小建议对我很有帮助。再次感谢!
Int(sender.titleLabel!.text!)!
button.tag = 22
button2.tag = 23
// etc
@IBAction func isClickedDate(_ sender: UIButton) {
    showOnDate = getShowList(sender.tag)
    tableView.reloadData()
}