在 objective-c 中向其他 object 发送消息的最佳方式
best way to message a different object in objective-c
我有一个 UITableView,每个 header 里面都有一个手势识别器。在手势处理程序中,我想对 header 视图中的某些内容进行更改。
-(void) sectionHeaderButtonPressed: (UIButton *)sender{
NSLog(@"Header Button pressed");
//UIView *mySubView = [sender.view.subviews objectAtIndex:0];
NSLog(@"Class: %@",[self class]);
int count = [self.view.subviews count];
NSLog(@"Self.view.subviews: %u",count);
Class buttonClass = NSClassFromString(@"UIButton");
for (int i=0; i < count; i++){
int subViewCount = [[self.view.subviews objectAtIndex:i] subviews].count;
Class className = [[self.view.subviews objectAtIndex:i] class];
NSLog(@"SubView (%u) Class:%@ SubViews: %u",i,className,subViewCount);
for (int j=0; j < subViewCount; j++){
Class className01 = [[[self.view.subviews objectAtIndex:i].subviews objectAtIndex:j ] class];
NSLog(@"----SubSubView (%u) Class:%@",j,[[[self.view.subviews objectAtIndex:i].subviews objectAtIndex:j ] class]);
NSLog(@"Comparing Class: %@ to Class: %@",className01, buttonClass);
if (className01 == buttonClass){
[[[self.view.subviews objectAtIndex:i].subviews objectAtIndex:j ] setTitle:@"ABCDE" forState:UIControlStateNormal];
NSLog(@"found button class");
}
}
}
}
上面的代码是手势处理程序,我可以找到按钮和所有其他子视图,但这真的很麻烦。
我似乎对一个 object 如何调用另一个 object 感到困惑。我想将 header 视图向下传递给手势处理程序,但不知道该怎么做。
如何直接发送或访问 header 视图 and/or 它的子视图。如果我有几个相同的 class 类型,那么查看 class 名称不会有多大用处。
问题是关于在另一个 object 中调用动作的正确方法。 运行 通过所有子视图似乎不是正确的方法。基于 class 名称的 id 是一种容易出错的方法,因为您可能有许多相同的 class.
我想要一个 "slide in from the side" 选择菜单,并根据用户从菜单中选择的内容修改 header。他们将点击 header,这将调用手势处理程序,这将调用滑出菜单,滑出菜单将调用 header 以使其更改其内容。
这是令人困惑的最后一部分,当 header 视图内容完全不同 objects.
时,如何获取菜单来更改 header 视图内容
最好的方法是使用委托,让您的 ViewController 为您完成繁重的工作。可以找到有关如何创建委托的一些示例 here。
使用自定义委托协议创建自定义视图
您需要做的第一件事是创建要实现的 HeaderView 的子类。正如您自己所说,您的代码变得有点麻烦,这将是创建自定义视图的好机会。
在此自定义视图中,根据需要重新创建 header,并使用界面生成器或以编程方式连接一些 labels/buttons(记住更改 UI 的所有弱指针如果您以编程方式执行此操作,元素将变得强大,我假设您将使用界面构建器)
您的 .h 应如下所示:
#import <UIKit/UIKit.h>
@protocol CustomHeaderViewDelegate;
@interface CustomHeaderView : UIView
@property (nonatomic, weak) UILabel *someLabel;
@property (nonatomic, weak) UILabel *someButton;
@property (nonatomic, weak) id<CustomHeaderViewDelegate> delegate;
@end
@protocol CustomHeaderViewDelegate <NSObject>
- (void)customHeaderView:(CustomHeaderView *)customheaderView receivedTouchOnButton:(UIButton *)button;
@end
和您的 .m 文件:
#import "CustomHeaderView.h"
@implementation CustomHeaderView
- (IBAction)buttonPressed:(id)sender {
if (self.delegate) {
[self.delegate customHeaderView:self receivedTouchOnButton:sender];
}
}
@end
使viewcontroller符合委托协议
在您的视图控制器中,您想从新创建的 CustomHeaderView 中实现委托协议。首先通过将 <CustomHeaderViewDelegate>
添加到 viewcontroller 的 .m 文件中的接口声明来确保您的 viewController 实际上符合新创建的协议。它应该看起来像:
...
#import "CustomHeaderView.h"
@interface YOURVIEWCONTROLLER () <CustomHeaderViewDelegate>
...
现在您可以在 viewController 的某处添加以下方法:
- (void)customHeaderView:(CustomHeaderView *)customheaderView receivedTouchOnButton:(UIButton *)button {
[button setTitle:@"ABCDE" forState:UIControlStateNormal];
}
正在将您的 header 添加到 tableView
在您的 viewForHeaderInSection 代码中执行如下操作:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
CustomHeaderView headerView = [[CustomHeaderView alloc] init];
headerView.delegate = self;
/* do some more customisation */
return headerView;
}
找到你的按钮
如果您想在某个部分中找到您的按钮或其他视图 header,您只需执行以下操作:
CustomHeaderView *customHeaderView = (CustomHeaderView *)[self tableView:YOURTABLEVIEW viewForHeaderInSection:SOMESECTION];
customHeaderView.button;
我有一个 UITableView,每个 header 里面都有一个手势识别器。在手势处理程序中,我想对 header 视图中的某些内容进行更改。
-(void) sectionHeaderButtonPressed: (UIButton *)sender{
NSLog(@"Header Button pressed");
//UIView *mySubView = [sender.view.subviews objectAtIndex:0];
NSLog(@"Class: %@",[self class]);
int count = [self.view.subviews count];
NSLog(@"Self.view.subviews: %u",count);
Class buttonClass = NSClassFromString(@"UIButton");
for (int i=0; i < count; i++){
int subViewCount = [[self.view.subviews objectAtIndex:i] subviews].count;
Class className = [[self.view.subviews objectAtIndex:i] class];
NSLog(@"SubView (%u) Class:%@ SubViews: %u",i,className,subViewCount);
for (int j=0; j < subViewCount; j++){
Class className01 = [[[self.view.subviews objectAtIndex:i].subviews objectAtIndex:j ] class];
NSLog(@"----SubSubView (%u) Class:%@",j,[[[self.view.subviews objectAtIndex:i].subviews objectAtIndex:j ] class]);
NSLog(@"Comparing Class: %@ to Class: %@",className01, buttonClass);
if (className01 == buttonClass){
[[[self.view.subviews objectAtIndex:i].subviews objectAtIndex:j ] setTitle:@"ABCDE" forState:UIControlStateNormal];
NSLog(@"found button class");
}
}
}
}
上面的代码是手势处理程序,我可以找到按钮和所有其他子视图,但这真的很麻烦。
我似乎对一个 object 如何调用另一个 object 感到困惑。我想将 header 视图向下传递给手势处理程序,但不知道该怎么做。
如何直接发送或访问 header 视图 and/or 它的子视图。如果我有几个相同的 class 类型,那么查看 class 名称不会有多大用处。
问题是关于在另一个 object 中调用动作的正确方法。 运行 通过所有子视图似乎不是正确的方法。基于 class 名称的 id 是一种容易出错的方法,因为您可能有许多相同的 class.
我想要一个 "slide in from the side" 选择菜单,并根据用户从菜单中选择的内容修改 header。他们将点击 header,这将调用手势处理程序,这将调用滑出菜单,滑出菜单将调用 header 以使其更改其内容。
这是令人困惑的最后一部分,当 header 视图内容完全不同 objects.
时,如何获取菜单来更改 header 视图内容最好的方法是使用委托,让您的 ViewController 为您完成繁重的工作。可以找到有关如何创建委托的一些示例 here。
使用自定义委托协议创建自定义视图
您需要做的第一件事是创建要实现的 HeaderView 的子类。正如您自己所说,您的代码变得有点麻烦,这将是创建自定义视图的好机会。
在此自定义视图中,根据需要重新创建 header,并使用界面生成器或以编程方式连接一些 labels/buttons(记住更改 UI 的所有弱指针如果您以编程方式执行此操作,元素将变得强大,我假设您将使用界面构建器)
您的 .h 应如下所示:
#import <UIKit/UIKit.h>
@protocol CustomHeaderViewDelegate;
@interface CustomHeaderView : UIView
@property (nonatomic, weak) UILabel *someLabel;
@property (nonatomic, weak) UILabel *someButton;
@property (nonatomic, weak) id<CustomHeaderViewDelegate> delegate;
@end
@protocol CustomHeaderViewDelegate <NSObject>
- (void)customHeaderView:(CustomHeaderView *)customheaderView receivedTouchOnButton:(UIButton *)button;
@end
和您的 .m 文件:
#import "CustomHeaderView.h"
@implementation CustomHeaderView
- (IBAction)buttonPressed:(id)sender {
if (self.delegate) {
[self.delegate customHeaderView:self receivedTouchOnButton:sender];
}
}
@end
使viewcontroller符合委托协议
在您的视图控制器中,您想从新创建的 CustomHeaderView 中实现委托协议。首先通过将 <CustomHeaderViewDelegate>
添加到 viewcontroller 的 .m 文件中的接口声明来确保您的 viewController 实际上符合新创建的协议。它应该看起来像:
...
#import "CustomHeaderView.h"
@interface YOURVIEWCONTROLLER () <CustomHeaderViewDelegate>
...
现在您可以在 viewController 的某处添加以下方法:
- (void)customHeaderView:(CustomHeaderView *)customheaderView receivedTouchOnButton:(UIButton *)button {
[button setTitle:@"ABCDE" forState:UIControlStateNormal];
}
正在将您的 header 添加到 tableView
在您的 viewForHeaderInSection 代码中执行如下操作:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
CustomHeaderView headerView = [[CustomHeaderView alloc] init];
headerView.delegate = self;
/* do some more customisation */
return headerView;
}
找到你的按钮
如果您想在某个部分中找到您的按钮或其他视图 header,您只需执行以下操作:
CustomHeaderView *customHeaderView = (CustomHeaderView *)[self tableView:YOURTABLEVIEW viewForHeaderInSection:SOMESECTION];
customHeaderView.button;