Методы делегата UITableView не отвечают - PullRequest
0 голосов
/ 16 марта 2011

Я довольно новичок в разработке IOS, так что простите, если эта проблема окажется тривиальной. Вот случай:

Я хочу иметь возможность вызывать метод didSelectRowAtIndexPath для запуска некоторых действий, когда пользователь взаимодействует с ячейкой табличного представления. Тем не менее, кажется, что этот метод никогда не вызывается по какой-то причине. Я совершенно уверен, что мой код действителен. Я установил свойства delegate и dataSource и соответствую протоколам UITableViewDelegate и UITableViewDataSource.

Если бы кто-то мог пролить свет на это, я был бы очень благодарен.

Мой код:

#import <UIKit/UIKit.h>
#import <MessageUI/MessageUI.h>
@class Employee;

#define kTelephoneRowIndex  0
#define kEmailRowIndex      1
#define kLeftLabelTag        4096
#define kRightLabelTag      4097


@interface PersonnelDetailsViewController : UIViewController <UITableViewDelegate,  
UITableViewDataSource, MFMailComposeViewControllerDelegate> {
    UITableView *contactDetailsTable;
Employee *employee;
}

@property (nonatomic, retain) UITableView *contactDetailsTable;
@property (nonatomic, retain) Employee *employee;

+ (NSString *)resourceFilePath:(NSString *)fileName ofType:(NSString *)type;


@end

и мой .m файл

#import <QuartzCore/QuartzCore.h>
#import "PersonnelDetailsViewController.h"
#import "Employee.h"


@implementation PersonnelDetailsViewController

@synthesize contactDetailsTable, employee;


+ (NSString *)resourceFilePath:(NSString *)fileName ofType:(NSString *)type {
return [[NSBundle mainBundle] pathForResource:fileName ofType:type];
}

- (void)loadView {
[super loadView];

// Create the header view for the table view
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 110)];

// Set the image, using rounded corners
UIImage *employeeImage;
if ([employee.image length] == 0)
    employeeImage = [UIImage imageNamed:@"logoL1nda70by80"];
else
    employeeImage = [UIImage imageNamed:employee.image];

UIImageView *employeeImageView = [[UIImageView alloc] initWithImage:employeeImage];
employeeImageView.frame = CGRectMake(10, 15, 70, 80);
employeeImageView.layer.masksToBounds = YES;
employeeImageView.layer.cornerRadius = 5.0;
employeeImageView.layer.borderWidth = 1.0;
employeeImageView.layer.borderColor = [[UIColor grayColor] CGColor];
[headerView addSubview:employeeImageView];

UILabel *nameView = [[UILabel alloc] initWithFrame:CGRectMake(95, 35, 180, 20)];
nameView.text = employee.name;
nameView.font = [UIFont boldSystemFontOfSize:18];
[headerView addSubview:nameView];

UILabel *functionView = [[UILabel alloc] initWithFrame:CGRectMake(95, 55, 140, 16)];
functionView.text = employee.function;
functionView.textColor = [UIColor grayColor];
functionView.font = [UIFont systemFontOfSize:14];
[headerView addSubview:functionView];

[employeeImage release];
[employeeImageView release];
[nameView release];
[functionView release];

contactDetailsTable = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 370) style: UITableViewStyleGrouped];
contactDetailsTable.backgroundColor = [UIColor clearColor];
contactDetailsTable.tableHeaderView = headerView;
[headerView release];
contactDetailsTable.delegate = self;
contactDetailsTable.dataSource = self;

[self.view addSubview:contactDetailsTable];
}

- (void)viewDidUnload {
self.contactDetailsTable = nil;
self.employee = nil;

[super viewDidUnload];
}

- (void)viewWillAppear:(BOOL)animated {
[contactDetailsTable reloadData];
}

- (void)dealloc {
[contactDetailsTable release];
[employee release];
[super dealloc];
}

#pragma mark -
#pragma mark Table View Data Source Methods
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 2;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;did
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *contactDetailIdentifier = @"contactDetailIdentifier";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:contactDetailIdentifier];

if (cell == nil) {      
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                   reuseIdentifier:contactDetailIdentifier] autorelease];
    UILabel *leftLabel = [[UITextField alloc] initWithFrame:CGRectMake(5, 12, 70, 25)];
    leftLabel.textAlignment = UITextAlignmentRight;
    leftLabel.textColor = [UIColor grayColor];
    leftLabel.tag = kLeftLabelTag;
    leftLabel.userInteractionEnabled = NO;
    [cell.contentView addSubview:leftLabel];
    [leftLabel release];

    UILabel *rightLabel = [[UITextField alloc] initWithFrame:CGRectMake(90, 12, 160, 25)];
    rightLabel.font = [UIFont boldSystemFontOfSize:16];
    rightLabel.tag = kRightLabelTag;
    rightLabel.userInteractionEnabled = NO;
    [cell.contentView addSubview:rightLabel];
    [rightLabel release];
}
NSUInteger row = [indexPath row];
UILabel *leftLabel = (UILabel *)[cell viewWithTag:kLeftLabelTag];
UILabel *rightLabel = (UILabel *)[cell viewWithTag:kRightLabelTag];

switch (row) {
    case kTelephoneRowIndex:
        leftLabel.text = @"telefoon";
        rightLabel.text = employee.phone;
        break;
    case kEmailRowIndex:
        leftLabel.text = @"e-mail";
        rightLabel.text = employee.email;
        break;
    default:
        break;
}

return cell;
}

#pragma mark -
#pragma mark Table View Delegate Methods
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
return nil;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSUInteger row = indexPath.row;

if (row == 1) {
    MFMailComposeViewController *mailController = [[MFMailComposeViewController alloc] init];
    [mailController setToRecipients:[NSArray arrayWithObject:employee.email]];
    [mailController.navigationBar setTintColor:[UIColor blackColor]];

    [self presentModalViewController:mailController animated:YES];
    mailController.mailComposeDelegate = self;
    [mailController release];
}

NSLog(@"Row selected is: %d", row);
}

#pragma mark -
#pragma mark MFMailCompose View Delegate Methods
- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
[self dismissModalViewControllerAnimated:YES];
}


@end

Ответы [ 2 ]

1 голос
/ 16 марта 2011

Проверьте документ на tableView:willSelectRowAtIndexPath::

Возвращает объект NSIndexPath, отличный от indexPath, если вы хотите, чтобы была выбрана другая ячейка.Верните nil, если вы не хотите, чтобы строка была выделена.

Вы возвращаете nil, в основном говоря, что табличное представление не хочет, чтобы эта строка была выбрана.Поэтому tableView:didSelectRowAtIndexPath: не называется.

0 голосов
/ 11 сентября 2013

Когда у меня возникла эта проблема, я обнаружил, что решение было использовать willSelectRowAtIndexPath. В других местах того же проекта didSelectItemAtIndexPath вызывается нормально.

#pragma mark - UITableViewDelegate

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // for some reason this is getting called instead of didSelectItemAtIndexPath
    [self viewDetails:indexPath.row];
    return indexPath;
}

- (void)tableView:(UITableView *)tableView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
//    [self viewDetails:indexPath.row];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...