如何访问另一个控制器/视图 (iOS)

发布于 2024-12-29 09:06:29 字数 352 浏览 0 评论 0原文

我有三个独立的类,UIViewController (A) 和两个 UITableViewController(B 和 C)。

我将表 B 和 C 添加到 A 中。

[A.view addSubview:B.tableView];

[A.view addSubview:C.tableView];

现在我需要通过在另一个表中进行选择来更改/重新加载一个表。例如,在B中选择“肉”则C变为“鸡肉、猪肉……”,选择“水果”则得到“苹果、西红柿……”。

我的问题通常是如何访问另一个控制器/视图。我应该在B中的didSelectRowAtIndexPath中写什么来访问另一个控制器(A,C)?

I have three separated class, UIViewController (A) and two UITableViewControllers (B and C).

I add table B and C into A.

[A.view addSubview:B.tableView];

[A.view addSubview:C.tableView];

Now I need to change/reload one table by the selection in another table. For example, select "meat" in B then C become "chicken, pork...", select "fruit" then get "apple, tomato...".

My question is generally Howto get access to another controller/view. What should I write in didSelectRowAtIndexPath in B to access another controller (A, C)?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

铃予 2025-01-05 09:06:29

您正在寻找委托。给B和C添加一个协议,让对方实现。

我很久以前写了一个示例代码

在那里,CheckTableController 可以通知 ShowFavoritesTableController,因为第二个控制器实现了第一个控制器的委托协议。

You are looking for delegation. Add a protocol to B and C and let the other implement it.

I wrote a sample code quite along time ago.

In there the CheckTableController can inform the ShowFavoritesTableController, as the second implements the delegate protocol of the first.

赏烟花じ飞满天 2025-01-05 09:06:29

我通常通过 NSNotificationCenter 来完成此操作。在

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

使用NotificationCenter广播一条消息。

[[NSNotificationCenter defaultCenter]postNotificationName:@"NotificationName" object:myObj];

在具有接收端的类上,将其设置为在 viewDidLoad 或 init 方法中侦听此通知 在

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTable:) name:@"NotificationName" object:nil];

.m 文件中声明您的方法 请

-(void)reloadTable:(NSNotification*)n {
[tableView reloadData];
}

记住,当在 dealloc 方法中销毁对象时,删除观察者
如果您使用 ARC

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

如果您不使用 ARC 请记住超级

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

I usually do this through the NSNotificationCenter. In the

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

broadcast a message using NotificationCenter.

[[NSNotificationCenter defaultCenter]postNotificationName:@"NotificationName" object:myObj];

On the class that has the receiving end set it to listen for this notification in the viewDidLoad or init method

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTable:) name:@"NotificationName" object:nil];

Have your method declared in the .m file

-(void)reloadTable:(NSNotification*)n {
[tableView reloadData];
}

Remember to remove the observer when the object is destroyed in the dealloc method
If you're using ARC

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

If you're not using ARC remember to super

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}
对你而言 2025-01-05 09:06:29

我认为最好的方法是,不使用三个单独的控制器,而只使用一个。这个控制器将是 UIViewController 的子类,其 .h 文件应如下所示:

@interface MyController : UIViewController <UITableViewDataSource, UITableViewDelegate>
    UITableView *firstTableView;
    UITableView *secondTableView;
@end

现在,在您的 .m 文件中,像这样设置表格:

- (id)init {
    if ((self = [super init])) {
        firstTableView = [[UITableView alloc] initWithFrame:/*desired frame*/ style:/*desired style*/];
        secondTableView = [[UITableView alloc] initWithFrame:/*desired frame*/ style:/*desired style*/];

        firstTableView.delegate = self;
        firstTableView.dataSource = self;

        secondTableView.delegate = self;
        secondTableView.dataSource = self;
    }
}

- (void)dealloc {
    [firstTableView release];
    [secondTableView release];
    [super dealloc];
}

然后,实现所需的 UITableViewDataSource 方法,如下所示:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == firstTableView) {
        // Do something
    } else if (tableView == secondTableView) {
        // Do something else
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    if (tableView == firstTableView) {
        // Configure the cell
    } else if (tableView == secondTableView) {
        // Configure the cell a different way
    }
}

最后,在 didSelectRowAtIndexPath 中:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == firstTableView) {
        // Update something that is linked to the return values of secondTableView's dataSource methods
        [secondTableView reloadData];
    }
}

这种方法确保您的控制器获得正确的 -viewDidLoad< /代码>, -viewWillAppear 等,自动进行。请记住,仅将视图控制器的视图添加为子视图意味着您的控制器将不会收到这些调用。

I think the best way to do this is, instead of using three separate controllers, just to use one. This one controller will be a subclass of UIViewController, and its .h file should look something like this:

@interface MyController : UIViewController <UITableViewDataSource, UITableViewDelegate>
    UITableView *firstTableView;
    UITableView *secondTableView;
@end

Now, in your .m file, set the tables up like so:

- (id)init {
    if ((self = [super init])) {
        firstTableView = [[UITableView alloc] initWithFrame:/*desired frame*/ style:/*desired style*/];
        secondTableView = [[UITableView alloc] initWithFrame:/*desired frame*/ style:/*desired style*/];

        firstTableView.delegate = self;
        firstTableView.dataSource = self;

        secondTableView.delegate = self;
        secondTableView.dataSource = self;
    }
}

- (void)dealloc {
    [firstTableView release];
    [secondTableView release];
    [super dealloc];
}

Then, implement desired UITableViewDataSource methods like so:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == firstTableView) {
        // Do something
    } else if (tableView == secondTableView) {
        // Do something else
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    if (tableView == firstTableView) {
        // Configure the cell
    } else if (tableView == secondTableView) {
        // Configure the cell a different way
    }
}

Finally, in didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (tableView == firstTableView) {
        // Update something that is linked to the return values of secondTableView's dataSource methods
        [secondTableView reloadData];
    }
}

This approach ensures that your controller gets the right -viewDidLoad, -viewWillAppear, and so on, automatically. Remember, just adding view controller's views as subviews means that your controller will not receive these calls.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文