我正在开展一个项目,我必须预先选择一个特定的单元格。
我可以使用-willDisplayCell
预选一个单元格,但是当用户点击任何其他单元格时,我无法取消选择它。
- (void)tableView:(UITableView*)tableView
willDisplayCell:(UITableViewCell*)cell
forRowAtIndexPath:(NSIndexPath*)indexPath
{
AppDelegate_iPad *appDelegte =
(AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
if ([appDelegte.indexPathDelegate row] == [indexPath row])
{
[cell setSelected:YES];
}
}
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
AppDelegate_iPad *appDelegte =
(AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
appDelegte.indexPathDelegate = indexPath;
[materialTable deselectRowAtIndexPath:indexpath1 animated:NO];
}
你能帮忙吗?
答案 0 :(得分:391)
使用此代码
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//Change the selected background view of the cell.
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
//Change the selected background view of the cell.
tableView.deselectRow(at: indexPath, animated: true)
}
答案 1 :(得分:116)
在表格视图委托didSelectRowAtIndexpath
(或从任何地方)
[myTable deselectRowAtIndexPath:[myTable indexPathForSelectedRow] animated:YES];
答案 2 :(得分:37)
试试这个:
for (NSIndexPath *indexPath in tableView.indexPathsForSelectedRows) {
[tableView deselectRowAtIndexPath:indexPath animated:NO];
}
答案 3 :(得分:28)
请检查委托方法是否正确。例如;
-(void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
的
-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
答案 4 :(得分:23)
为此,在Swift中进行扩展可能很有用。
Swift 4:
Swift扩展(例如在UITableViewExtension.swift文件中):
import UIKit
extension UITableView {
func deselectSelectedRow(animated: Bool)
{
if let indexPathForSelectedRow = self.indexPathForSelectedRow
{
self.deselectRow(at: indexPathForSelectedRow, animated: animated)
}
}
}
使用例如:
override func viewWillAppear(_ animated: Bool)
{
super.viewWillAppear(animated)
self.tableView.deselectSelectedRow(animated: true)
}
答案 5 :(得分:22)
tableView.deselectRow(at: indexPath, animated: true)
答案 6 :(得分:11)
除了将单元格设置为选中之外,还需要通知tableView已选择单元格。在[{1}}方法中添加对-tableView:selectRowAtIndexPath:animated:scrollPosition:
的通话:您可以正常取消选择。
willDisplayCell:
请务必使用UITableViewScrollPositionNone来避免奇怪的滚动行为。
答案 7 :(得分:7)
这是Swift 4的解决方案
in tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
只需添加
tableView.deselectRow(at: indexPath, animated: true)
它就像一个魅力
示例:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
//some code
}
答案 8 :(得分:6)
这应该有效:
[tableView deselectRowAtIndexPath:indexpath1 animated:NO];
确保materialTable和tableView指向同一个对象。
材质是否在Interface Builder中连接到tableView?
答案 9 :(得分:6)
基于saikirans解决方案,我写了这个,这对我有帮助。在.m文件中:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if(selectedRowIndex && indexPath.row == selectedRowIndex.row) {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
selectedRowIndex = nil;
}
else { self.selectedRowIndex = [indexPath retain]; }
[tableView beginUpdates];
[tableView endUpdates];
}
在头文件中:
@property (retain, nonatomic) NSIndexPath* selectedRowIndex;
我也不是很有经验,所以要仔细检查内存泄漏等。
答案 10 :(得分:6)
如果要在第一次单击时选择任何表格单元格,并在第二次单击时取消选择,则应使用以下代码:
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.selectedIndexPath &&
[indexPath compare:self.selectedIndexPath] == NSOrderedSame) {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
self.selectedIndexPath = nil;
}
else {
self.selectedIndexPath = indexPath;
}
}
答案 11 :(得分:5)
Sub PerhapsADate()
Dim s As String, MonthAsNumber As Long
Dim MonthAsString As String
s = Range("B9").Text
MonthAsNumber = --Split(s, "/")(0)
MonthAsString = Format(CDate(s), "mmmm")
MsgBox MonthAsNumber & vbCrLf & MonthAsString
End Sub
答案 12 :(得分:4)
Swift 2.0:
tableView.deselectRowAtIndexPath(indexPath, animated: true)
答案 13 :(得分:3)
NSIndexPath * index = [self.menuTableView indexPathForSelectedRow];
[self.menuTableView deselectRowAtIndexPath:index animated:NO];
根据您的代码放置此代码,您将取消选择您的单元格。
答案 14 :(得分:3)
你能试试吗?
- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
AppDelegate_iPad *appDelegte =
(AppDelegate_iPad *)[[UIApplication sharedApplication] delegate];
NSIndexPath *indexpath1 = appDelegte.indexPathDelegate;
appDelegte.indexPathDelegate = indexPath;
UITableViewCell *prevSelectedCell = [tableView cellForRowAtIndexPath: indexpath1];
if([prevSelectedCell isSelected]){
[prevSelectedCell setSelected:NO];
}
}
它对我有用。
答案 15 :(得分:3)
试试这个
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES];
答案 16 :(得分:2)
Swift 3.0:
在protocol conformance section of the ray wenderlich swift style guide之后,为了将相关方法组合在一起,请将此扩展名放在您的视图控制器类下面:
cities['white plains'] = {'white plains'}
cities['white plains'] = {'country': 'united states'}
cities['white plains'] = {'population':'60 thousand'}
cities['white plains'] = {'attraction': 'kensico dam'}
答案 17 :(得分:1)
斯威夫特
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// your code
// your code
// and use deselect row to end line of this function
self.tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
答案 18 :(得分:1)
Swift 3/4
在ViewController中:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
在自定义单元格中:
override func awakeFromNib() {
super.awakeFromNib()
selectionStyle = .none
}
答案 19 :(得分:1)
Swift 3
我也遇到过这种情况 - 当您导航或展开回到表格视图时,它通常不会取消选择之前选择的行。我把这个代码放在表视图控制器&效果很好:
override func viewDidAppear(_ animated: Bool) {
if let lastSelectedRow = tableView.indexPathForSelectedRow {
tableView.deselectRow(at: lastSelectedRow, animated: true)
}
}
答案 20 :(得分:1)
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
答案 21 :(得分:0)
由于预加载的数据,第一次点击时取消选择(DidDeselectRowAt);您需要通知tableView已经选择了该行,以便初始点击然后取消选择该行:
// Swift 3:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if tableView[indexPath.row] == "data value"
tableView.selectRow(at: indexPath, animated: false, scrollPosition: UITableViewScrollPosition.none)
}
}
答案 22 :(得分:0)
swift 3.0
tableView.deselectRow(at: indexPath, animated: true)
答案 23 :(得分:0)
我发现的是,除了将单元格设置为 selected 之外,还必须让表视图知道 select 给定索引路径的行
// Swift 3+
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if appDelegate.indexPathDelegate.row == indexPath.row {
self.tableView.selectRow(at: indexPath, animated: true, scrollPosition: .none)
cell.setSelected(true, animated: true)
}
}