0

这就是结构的样子。

--- UIView
   ---- ScrollView
       --- TableView

.

UIView *topView = [[UIView alloc]initWithFrame:CGRectMake(0, -250, 320, 250)];

UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 70, 320, 150) style:UITableViewStylePlain];
    tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
    tableView.delegate = self;
    tableView.dataSource = self;
    tableView.backgroundColor = [UIColor blackColor];
    tableView.separatorStyle = normal;
    [tableView reloadData];

    [topView addSubview:tableView];

    [self.scrollView addSubview:topView];

在表格视图中,我正在使用一个带有按钮的自定义表格视图单元格。这是我的 CellForRowAtIndex 中按钮的代码

[cell.btnDelete addTarget:self action:@selector(deleteAppointment:) forControlEvents:UIControlEventTouchUpInside];

现在要获取特定行,我在 deleteAppointment 中执行此操作

 UIButton *button = (UIButton *)sender;
    UITableViewCell *cell = (UITableViewCell *)button.superview;
    UITableView *tableView = (UITableView *)cell.superview;
    NSIndexPath *indexPath = [tableView indexPathForCell:cell];
    NSLog(@"row: %d",indexPath.row);

但它仍然给出以下错误。

-[ExceptionCell indexPathForCell:]: unrecognized selector sent to instance 0x210a2fa0

谁能帮我?

4

3 回答 3

6

它真的很简单,在cellForRowAtIndexPath. 只需像这样标记您的按钮

cell.button.tag = indexPath.row;

在按钮@selector 方法中从数组或字典(即您的数据源)中删除值

[array removeObjectAtIndex:button.tag];

现在重新加载 tableView。

[tableView reloadData];
于 2012-12-04T14:06:02.723 回答
0

该错误表示 您正在尝试调用indexPathForCell. 是一种方法,不是。ExceptionCellindexPathForCellUITableViewUITableViewCell

cell.superviewUITableView没有像您期望的那样返回您的。

于 2012-12-04T13:59:51.563 回答
0

从 TableView 中删除行时,您想要保留提供 DeleteRowsAtIndexPath 方法的直观动画,我一直在解决这个问题,并最终找到了一个简单的解决方案。

正如问题所问,我们正在使用带有自定义 UIButton 的自定义单元格来删除单元格

因此,您必须使用委托 // CallBack。下面的演示是针对 C# 中的 MonoTouch,在目标 C 中是相同的,但方法的命名略有不同 + 语法。

//TableViewController

//CALLBACK Methods WHEN DELETING A ROW
public void DeletedItem (MyObject arrayObject, CustomCell cellInstance)
    {
        NSIndexPath[] arrayPath = new NSIndexPath[1] { this.myTableView.IndexPathForCell (cellInstance) };

        this.myArray.RemoveItem (arrayObject);
        this.myTableView.DeleteRows (arrayPath, UITableViewRowAnimation.Fade);
    }


[Export("tableView:cellForRowAtIndexPath:")]
public virtual UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
    {

        ...

        cell.FactoryMethodsThatImUsing (myObject.items[indexPath.Row], DeletedItem);

        return cell;

    }

//自定义单元格

public delegate void FOODelegateMethods (MyObject item, CustomCell instance);
public event FOODelegateMethods ItemDeleted;

在我的工厂方法中

if (!(this.ItemDeleted is Delegate)) {
            this.ItemDeleted += new CustomCell.FOODelegateMethods (ResultCallBack);
        }

然后在 DeleteItem 操作

partial void DeleteItem (NSObject sender)
    {
        ItemDeleted(arrayObject, this);
    }
于 2013-08-05T14:24:34.043 回答