文件: ContactsViewController.m
在此文件中,我使用 didSelectRowAtIndexPath 方法推送新的视图控制器,以显示有关在表视图控制器上按下的名称的信息。将显示有关名称信息的视图控制器正在 Swift 中实现。我在此代码中引用的部分位于 didSelectRowAtIndexPath 方法中,行:
_myIndex = indexPath.row;
我相信 indexPath.row 应该返回在表视图控制器中点击的名称的索引。
#import "ContactsViewController.h"
#import "Contacts-Swift.h"
@interface ContactsViewController ()
@property (nonatomic, readwrite, strong) NSMutableArray* contacts;
@property (nonatomic, readwrite) NSInteger myIndex;
@end
@implementation ContactsViewController
-(id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
/*NSArray *contactArray = @[@"Johnny Appleseed", @"Paul Bunyan", @"Calamity Jane"];
_contacts = [NSMutableArray arrayWithArray:contactArray];*/
/*Contact *c1 = [[Contact alloc] initWithName: @"Johnny"];
Contact *c2 = [[Contact alloc] initWithName: @"Paul Bunyan"];
Contact *c3 = [[Contact alloc] initWithName: @"Calamity Jane"];*/
// _contacts = [NSMutableArray arrayWithArray: @[c1, c2, c3]];
self.contacts = [NSMutableArray array];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self.tableView registerClass: [UITableViewCell class]
forCellReuseIdentifier:@"UITableViewCell"];
}
- (NSInteger)tableView:(UITableView *)tableView
numberOfRowsInSection:(NSInteger)section
{
return self.contacts.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell" forIndexPath:indexPath];
Contact *contact = self.contacts[indexPath.row];
cell.textLabel.text = contact.name;
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
ContactsViewController *viewController = [self.navigationController.storyboard instantiateViewControllerWithIdentifier:@"the"];
[self.navigationController pushViewController:viewController animated:YES];
_myIndex = indexPath.row;
}
文件: 联系人视图控制器.h
这是我使用的头文件,以便在使用 swift 文件时访问目标 C 方法和变量。(我对目标 C 不是很熟悉,所以这个实现很有可能是导致我的问题的原因(。
#import <UIKit/UIKit.h>
@interface ContactsViewController : UITableViewController <UITableViewDelegate>
@property (nonatomic, readonly) NSInteger myIndex;
@property (nonatomic, readonly, strong) NSMutableArray* contacts;
@end
文件:现有联系人视图控制器.swift
在现有的ContactViewController中,我只是尝试将firstName标签设置为等于indexPath.row(在ContactsViewController.m文件中(的联系人数组中存在的文本。
import UIKit
@objc class ExistingContactViewController: UIViewController {
var contactsObject = ContactsViewController()
@IBOutlet weak var firstName: UILabel!
@IBOutlet weak var lastName: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
print("(contactsObject.myIndex)")
firstName.text = contactsObject.contacts[contactsObject.myIndex] as? String
}
单击添加到表视图控制器的名称时,打印的唯一索引
print("(contactsObject.myIndex)")
为 0。这告诉我我没有捕获点击的名称的索引。
我的情节提要的图像 最底部的场景是我尝试更改"名字"标签以显示点击的单元格名称的场景。
单击单元格时,我尚未能够更改此标签的标题。我已经能够在仅使用 swift 文件时实现此功能(通过观看大量视频(。我确信我在目标 C 文件中缺少一个关键概念,因此非常感谢任何建议和/或指针。如果需要任何其他详细信息,请告诉我!
谢谢。
似乎在您的didSelectRowAtIndexPath:
中,您正在将ContactsViewController
推送到导航堆栈,如果我理解正确,它应该是ExistingContactViewController
的实例。此外contactsObject
,在将ExistingContactViewController
推送到导航堆栈中之前(在执行viewDidLoad
之前(,您应该设置属性,否则它的值将始终是一个新的ContactsViewController
,这可能会导致问题。 我希望这有帮助!