UITableView indexPath 的子类 nil

Posted

技术标签:

【中文标题】UITableView indexPath 的子类 nil【英文标题】:Subclass of UITableView indexPath nil 【发布时间】:2015-03-10 03:28:08 【问题描述】:

我正在尝试子类化 UITableView。但是,我无法获得不为零的 indexPath。 tableView 有自定义单元格。

这是我的 TouchTableView.h

#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h> //I brought this in because I'm saving audio files in my app
#import "SimpleTableCell.h"



@protocol myTableViewDelegate;

@interface TouchTableView : UITableView <UITableViewDelegate, UITableViewDataSource, AVAudioRecorderDelegate, AVAudioPlayerDelegate, UITextViewDelegate, UITextFieldDelegate, UIAlertViewDelegate>

@property (nonatomic, weak) id<myTableViewDelegate> myDelegate;
@property (strong, nonatomic) NSMutableArray *sortedFiles;
@property (strong, nonatomic) NSString *simpleTableIdentifier;
@property (strong, nonatomic) SimpleTableCell *cell;
@property BOOL inverted;

-(void)refreshTable;

@end


@protocol myTableViewDelegate <NSObject>

- (void)selectedFile:(TouchTableView *)tableView withURL: (NSURL *) tableViewURL IndexPath:(NSIndexPath *)indexPath;
-(void)didDelete:(TouchTableView *)tableView IndexPath:(NSIndexPath *)indexPath;
-(void)setSortedFile:(TouchTableView *)tableView;

@end

我像这样附上一个长按:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    //bring in your custom cell here

    simpleTableIdentifier = @"SimpleTableCell";

    cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) 
        
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];

            [cell.textField setEnabled:NO];


            //put in long press
            UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
            [longPressGesture setMinimumPressDuration:1.0];

            [cell addGestureRecognizer:longPressGesture];

        
    
    return cell;

那么当长按激活时,我有以下方法:

- (void)longPress:(UILongPressGestureRecognizer *)gesture

    if (![cell.textField isEnabled]) 
        // only when gesture was recognized, not when ended
        if (gesture.state == UIGestureRecognizerStateBegan)
        
            // get affected cell
            cell = (SimpleTableCell *)[gesture view];

            // get indexPath of cell

            NSIndexPath *indexPath = [self indexPathForCell:cell];
            [self selectRowAtIndexPath:indexPath animated:NO scrollPosition:0];


            [cell.textField setEnabled:YES];
            [cell.textField becomeFirstResponder];


        
    

在 viewDidLoad 的 viewController 中,我有:

self.touchTableView = [[TouchTableView alloc] init];

 [self.tableView setDelegate:self.touchTableView];
 [self.tableView setDataSource:self.touchTableView];

 self.touchTableView.myDelegate = self;

问题是 indexPath 总是为零。你会注意到我调用 self 而不是 self.tableView 因为 self 是 tableView。有没有办法获取 indexPath?

【问题讨论】:

你在做什么没有意义。为什么TouchTableView 不是表格视图时会扩展UITableView。它的控制器应该使用表格视图。但是随后您的视图控制器似乎有自己的表视图并将该表视图的委托和数据源设置为您的TouchTableView 实例。所以现在你有两个表视图,都具有相同的数据源和委托。 【参考方案1】:

抱歉给大家添乱了。 rmaddy 是对的。荒谬的。解决办法:

在我的 ViewController.h 中我设置:

@property (weak, nonatomic) IBOutlet TouchTableView *tableView;

然后我将示例中的最后一个代码更改为

[self.tableView setDelegate:self.tableView];
[self.tableView setDataSource:self.tableView];  
self.tableView.myDelegate = self;
[self.tableView refreshTable];

现在我正在获取索引路径。

【讨论】:

以上是关于UITableView indexPath 的子类 nil的主要内容,如果未能解决你的问题,请参考以下文章

UITableView 中的 indexPath 和 indexPath.section

tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 没有被调用

获取 UITableView 中最近添加的行的 indexPath

如何在 UITableView 中获取选定的 indexPath.section 和 indexPath.row 值?

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) 几乎符合可选要求

UITableView 的 IndexPath 不起作用