gpt4 book ai didi

ios - 自定义 UIView 并从 UIView 内部的变量设置和获取自定义值

转载 作者:行者123 更新时间:2023-11-29 03:01:28 24 4
gpt4 key购买 nike

我有一个自定义的 uiview,当动态创建 uiview 时我有一个 setter 和一个 getter 我设置这个值是这样的:

for(NSDictionary *dictCategory in arrCategoryList)
{
NSString *strCategoryId = [dictCategory objectForKey:@"CategoryId"];
NSString *strCategoryName = [dictCategory objectForKey:@"Name"];
NSLog(@"%@ : %@",strCategoryId,strCategoryName);

UIViewMenuItem *linkMenu = [[UIViewMenuItem alloc] init];
[linkMenu setFrame:CGRectMake(10, i+1, 300, 35)];
[linkMenu setId:strCategoryId]; //here i set the value in the custom uiview
linkMenu.layer.zPosition = 7;
[viewSlide3 addSubview:linkMenu];
[linkMenu setBackgroundColor:[UIColor blueColor]];
linkMenu.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:.9];

UITapGestureRecognizer *singleFingerTap =
[[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(handleSingleTap:)];
[linkMenu addGestureRecognizer:singleFingerTap];

UILabel *labelMenu = [[UILabel alloc] init];
[labelMenu setFrame:CGRectMake(20, 0, 300, 35)];
[labelMenu setFont:[UIFont systemFontOfSize:16]];
[labelMenu setTextColor:[UIColor whiteColor]];
[linkMenu addSubview:labelMenu];
[labelMenu setText:strCategoryName];




i = i + 35 + 1;
}

现在,当我点击自定义 uiview 时,我想从自定义 uiview 取回值,所以我这样做:

- (void)handleSingleTap:(UITapGestureRecognizer *)recognizer {
CGPoint location = [recognizer locationInView:[recognizer.view superview]];

CGPoint touchPoint=[recognizer locationInView:[recognizer.view superview]];



UIViewMenuItem *tempView = (UIViewMenuItem *)recognizer.view;
NSNumber *tag = [NSNumber numberWithInt:tempView.tag];
NSString *idCat = [tempView getCatId];

NSLog(@"TAG %@",idCat);

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString: [NSString stringWithFormat:@"http://localhost:8888/MAMP/WHFC/SubCategories.php?categoryid=%d", idCat]]];

int i = 0;

NSError *e;
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:&e];
NSArray *arrCategoryList = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&e];




UIViewController *viewController = [[UIViewController alloc] init];
viewController.view.backgroundColor = [UIColor whiteColor];

UIView *uiView = [[UIView alloc] init];
[uiView setFrame:CGRectMake(0, 480, 320, 480)];
[uiView setBackgroundColor:[UIColor grayColor]];

viewController.view = uiView;


UITableView *uiTableView = [[UITableView alloc] init];
[uiTableView setFrame:CGRectMake(0, 0, 320, 480)];

[uiView addSubview:uiTableView];

[self presentViewController:viewController animated:YES completion:nil];



//Do stuff here...

但我一直从 NSString *idCat = [tempView getCatId] 中得到相同的值“13”;

这是自定义的 UIView 类:

#import <UIKit/UIKit.h>

@interface UIViewMenuItem : UIView
- (void) setId: (NSString *) cId;
- (NSString *) getCatId;


@end
NSString *catId;


#import "UIViewMenuItem.h"

@implementation UIViewMenuItem


- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}

- (void) setId: (NSString *) cId;
{
catId = cId;
//If possible, set things up for the new word
}

- (NSString *) getCatId{


return catId;


}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/

@结束

最佳答案

原则上,使用隐藏的(在类外部不可见)实例变量 cId 并提供 getter 和 setter 并没有错。

但是你的不是实例变量。它在接口(interface)和实现之间的某处声明。它是全局变量或静态变量。 (我对全局不是 100% 肯定,但我认为是。我遇到了一个链接器问题——重复对象——有一次我犯了同样的错误,并在两个类中使用相同的变量名。然而,它是它是全局的还是静态的并不重要。静态就够糟糕了。)

这至少意味着 UIViewMenuItem 的所有实例共享同一个变量 (!!!)。

首先:将它移动到 @implementation 和它的 @end 之间的某个位置。然后它应该按预期工作。

然后:懒惰并以 objective-c 方式解决它。去掉变量,去掉 getter 和 setter。如果您对公开的变量感到满意(它无论如何都可以通过 getter 和 setter 访问),那么只需添加一个 @property (nonatomic, retain) NSString *cid; 到界面。除非你有一个旧的编译器,否则基本上就是这样。编译器会自动添加 getter 和 setter(getCId 和 cId)。

编译器会添加一个在大多数情况下您不会自己使用的 iVar _cId。当您使用舒适的方式时,我不是 100% 肯定 iVar 的名称是 cId 还是 _cId。如果您关心,则可以通过向实现添加 @synthesize 语句来控制 iVar 的名称,并根据需要定义 iVar 名称。您可以添加更多自定义(再次自己声明 iVar,提供自定义 getter 和 setter),但是当您从属性中需要的只是您在问题及其代码示例中显示的内容时,就不需要这样做了。

关于ios - 自定义 UIView 并从 UIView 内部的变量设置和获取自定义值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23255361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com