选择段时如何从表视图中加载选定的数据?
Posted
技术标签:
【中文标题】选择段时如何从表视图中加载选定的数据?【英文标题】:how to load selected data from a table view when a segment is selected? 【发布时间】:2018-04-17 08:47:54 【问题描述】:我想知道如何从我的表视图加载所选数据,例如选择段索引等于1,表视图将重新加载并且只会显示状态等于批准的数据。因为正如您从下面的代码中看到的那样,我已经加载了具有所有状态的所有数据:.例如,如果 segmentView.selectedSegmentIndex == 1 表将重新加载状态等于已批准的数据。我已经可以确定选定的索引。我想要的是如何从表视图中访问这些数据,我可以根据状态加载选定的数据
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
// Table view cells are reused and should be dequeued using a cell identifier.
let cellIdentifier = "ToDoListTableViewCell"
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ToDoListTableViewCell
cell.delegate = self
// let toDoActionItem = fetchedResultsController.object(at: indexPath)
if let getTempDetails: [String : Any] = getAllDetail[indexPath.row]
print("ang tanan data:" , getTempDetails)
if let str = getTempDetails["status"] as? [String: String]
if let name = str["name"]
if name == "ongoing"
cell.toDoItemLabel.text = getTempDetails["name"] as? String
cell.statuslabel.backgroundColor = created
// cell.label.textColor = UIColor(red: 0.9294, green: 0.3333, blue: 0.1804, alpha: 1.0)
// cell.backgroundColor = created
else if name == "approved"
cell.toDoItemLabel.text = getTempDetails["name"] as? String
cell.statuslabel.backgroundColor = done
cell.checkBoxButton.isSelected = true
else if name == "for approval"
cell.toDoItemLabel.text = getTempDetails["name"] as? String
cell.statuslabel.backgroundColor = pending
else if name == "near expiry"
cell.toDoItemLabel.text = getTempDetails["name"] as? String
cell.statuslabel.backgroundColor = neardue
else if name == "expired"
cell.toDoItemLabel.text = getTempDetails["name"] as? String
cell.statuslabel.backgroundColor = expired
else
print("false")
cell.toDoItemLabel.text = "LOLS"
code for segment (in selecting segment)
func selectSegmentInSegmentView(segmentView: SMSegmentView)
if segmentView.selectedSegmentIndex == 1
print("ang index nga emo ge click is one")
// let selectedSegment : SMSegment = segmentView.selectedSegment!
// self.userName = selectedSegment.label.text!
else
logic here
self.setUpTableView()
or could be self.tableView.reloadData()
【问题讨论】:
您的问题是仅过滤“已批准”/“过期”还是有关 TableView?我会使用“selectedDetailsArray”,它将根据 segmentedControl 选择过滤getAllDetail
,并仅将这个用于数据源(numberOfRows、cellForRow 等)
我想要的是例如 segmentView.selectedSegmentIndex == 1 表将加载状态等于批准的数据。
您在分段控制中是否有 5 个分段,分别命名为正在进行、已批准、待批准、即将到期和已过期?
是的索引等于状态数
@DurnKurvirck 你能解释一下代码吗?来参加昨天的聊天,我们可以在那里讨论
【参考方案1】:
最好的选择是:
为Display创建一个通用的array
,用于显示tableView
中的数据:
并且在所有条件下都像这样使用它:
像这样创建一个通用函数:
func filterDataStatusWise(strStatus:String)
for dict in arrMainResponse
let strStatus = arrMainResponse["status"]
if strStatus["name"] = strStatus
//Whatever data add in arrForDisplay here
tableView.reloadData()
然后像这样使用它:
var arrForDisplay = [String:Any]()
if condition1
filterDataStatusWise(strStatus: "ongoing")
else if condition2
filterDataStatusWise(strStatus: "approved")
else if condition3
filterDataStatusWise(strStatus: "for approval")
else if condition4
filterDataStatusWise(strStatus: "near expiry")
else
filterDataStatusWise(strStatus: "expired")
希望对你有帮助!
【讨论】:
嗨,先生,您在吗? @DurnKurvirck 我回到了聊天部分,我们可以继续那里【参考方案2】:在选择UISegmentControl
的不同段时,您只需要创建5个单独的数组来加载。
var ongoingArr = [[String: Any]]() // For segment index 0
var approvedArr = [[String: Any]]() // For segment index 1
var forApprovalArr = [[String: Any]]() // For segment index 2
var nearExpiryArr = [[String: Any]]() // For segment index 3
var expiredArr = [[String: Any]]() // For segment index 4
您拥有完整的数据getAllDetail
,并且您正在通过 API 或上一个屏幕获取此数组中的数据:
var getAllDetail = [[String: Any]]()
如果是从 API 获取数据,则在加载
getAllDetail
中的数据后加载 5 个以上的数组。只是将数组的扩展创建为:
extension Array where Element == [String: Any]
func filterArray(_ statusName: String) -> [Element]
return self.filter infoDict -> Bool in
if let statusDict = infoDict["status"] as? [String: String], let name = statusDict["name"]
return name == statusName
return false
并且,加载超过 5 个数组:
func loadSegmentArray()
ongoingArr = getAllDetail.filterArray("ongoing")
approvedArr = getAllDetail.filterArray("approved")
forApprovalArr = getAllDetail.filterArray("for approval")
nearExpiryArr = getAllDetail.filterArray("near expiry")
expiredArr = getAllDetail.filterArray("expired")
// Select 0th index of segment and reload table
segmentView.selectedSegmentIndex = 0
self.setUpTableView() // Reload Table view
在您的函数selectSegmentInSegmentView
中,只需重新加载表格视图:
func selectSegmentInSegmentView(segmentView: SMSegmentView)
self.setUpTableView()
并根据这 5 个数组更新您的
UITabelView
委托和数据源方法。对于示例,我写的是
numberOfRowsInSection
和cellForRowAt indexPath
:
public func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
switch segmentView.selectedSegmentIndex
case 0:
return ongoingArr.count
case 1:
return approvedArr.count
case 2:
return forApprovalArr.count
case 3:
return nearExpiryArr.count
case 4:
return expiredArr.count
default:
return 0
public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cellIdentifier = "ToDoListTableViewCell"
let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! ToDoListTableViewCell
cell.delegate = self
var infoDict = [String: Any]()
switch segmentView.selectedSegmentIndex
case 0:
infoDict = ongoingArr[indexPath.row]
cell.statuslabel.backgroundColor = // Color of onging
case 1:
infoDict = approvedArr[indexPath.row]
cell.statuslabel.backgroundColor = // Color of approvedArr
case 2:
infoDict = forApprovalArr[indexPath.row]
cell.statuslabel.backgroundColor = // Color of forApprovalArr
case 3:
infoDict = nearExpiryArr[indexPath.row]
cell.statuslabel.backgroundColor = // Color of nearExpiryArr
case 4:
infoDict = expiredArr[indexPath.row]
cell.statuslabel.backgroundColor = // Color of expiredArr
default:
cell.statuslabel.backgroundColor = .black
cell.toDoItemLabel.text = infoDict["name"] as? String
return cell
【讨论】:
我正在从 API 获取数据 响应API,首先加载getAllDetail
,然后调用加载所有5个数组并设置选定段索引= 0然后重新加载表的方法
你能打开一个聊天,我可以通过那里澄清
我创建了一个函数 loadSegmentArray
在加载 getAllDetail
后调用这个函数来响应 API 成功
我找不到聊天选项,我对堆栈溢出有点陌生。【参考方案3】:
根据所选索引(状态)过滤数组:
func tableView(tableView: UITableView, numberOfRowsInSection section:
Int) -> Int
switch segmentView.selectedSegmentIndex
case 0:
if self.expiredArray == nil
return 0
return (self.expiredArray?.count)!
case 1:
if self.approvedArray == nil
return 0
return (self.complaintArray?.count)!
default:
break
return 0
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
switch segmentView.selectedSegmentIndex
case 0:
// Load from expired array
case 1:
// Load from approved array
default:
break
return UITableViewCell()
func selectSegmentInSegmentView(segmentView: SMSegmentView)
if segmentView.selectedSegmentIndex == 1
// Write your code to filter array here based on status
else
// Write your code to filter array here based on status
// reload tableview here.....
【讨论】:
以上是关于选择段时如何从表视图中加载选定的数据?的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式将数据从表视图控制器传递到另一个控制器? [复制]