如何在不调用 [关闭] 的情况下将整数从控制器设置到子视图
Posted
技术标签:
【中文标题】如何在不调用 [关闭] 的情况下将整数从控制器设置到子视图【英文标题】:How to Set integer from controller to Subview without calling [closed] 【发布时间】:2013-03-27 13:03:09 【问题描述】:我想将我的主控制器的 int 计数值设置为数据单元控制器文件。 我现在不想调用该数据单元控制器文件我想稍后调用该数据单元 M 控制器文件但我想从我的主控制器文件中设置计数整数,以便当我调用我的数据单元文件时它需要计数整数我从我的主控制器设置并使用它。
我的 dataViewController.m
- (void)viewDidLoad
[super viewDidLoad];
UIView *backgroundCoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1024, 768)];
backgroundCoverView.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.6];
toggleSwitch1 = [UIButton buttonWithType:UIButtonTypeCustom];
toggleSwitch2 = [UIButton buttonWithType:UIButtonTypeCustom];
[self.view addSubview:backgroundCoverView];
// Add the 6 buttons and columns.
NSMutableArray *columnsMutable = [NSMutableArray arrayWithCapacity:6];
NSMutableArray *buttonsMutable = [NSMutableArray arrayWithCapacity:6];
for (int i=0; i<6; i++)
DataCell* app = (DataCell*)[[UIApplication sharedApplication] delegate];
[app MysetValue:6];
DataColumn *column = [[DataColumn alloc] initWithFrame:CGRectMake(86+i*124+(i>=3?100:0), 230, 110, 382)];
column.cellsVisible = NO;
if (i>0)
column.hidden = YES;
[self.view addSubview:column];
[columnsMutable addObject:column];
// 我正在调用作为 SubView 类的 dataColumn,从该 dataColumn 子视图类我调用数据单元格类将单元格填充到列中
- (id)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
//self.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"mixBackgroundTile.png"]];
// this commented line is used to display dotted background in percentage slider bar
// Add cells.
NSMutableArray *mutableCells = [NSMutableArray arrayWithCapacity:5];
for (int i=4; i>=0; i--)
DataCell *cell = [[DataCell alloc] initWithFrame:CGRectMake(100, i*(74+3), 109, 74)]; // data order fix
//VSLDataCell *cell = [[VSLDataCell alloc] initWithFrame:CGRectMake(-90, i*(74+3), 109, 74)]; for left hand side cell
[mutableCells addObject:cell];
[self addSubview:cell];
cells = [NSArray arrayWithArray:mutableCells];
return self;
现在在数据单元类中,我想根据单元格号和列号分配不同的图像,所以我想知道我现在是哪一列
【问题讨论】:
一个不会“调用M文件”,这与文件无关。我假设您想在不同类的两个对象之间进行通信,是这样吗? @H2CO3 是的,我想从我的 mainController.m 设置位于单元格 data.m 中的 columNumber 变量 好的,这表明DataCell
,顾名思义,是不是应用程序委托。应用程序委托是 Cocoa Touch 中一个非常特殊的对象,而不仅仅是您创建的东西。所以让应用程序委托的这个属性没有意义。它是DataCell
类的属性。
@Rob 好的,还有其他方法可以传递 int 或 Not 吗?
这对于 Stack Overflow 问题无效。我们应该把它移到聊天中:chat.***.com/rooms/27014。
【参考方案1】:
一些想法:
您编写了一个方法,MysetValue
,这有点多余。当您合成您的columNumber
属性时,它会为您编写一个setter 方法setColumNumber
,它会为您执行此操作。如果不需要,请不要编写自己的 setter。
如果您有一个属性,columNumber
,您已在 .h 中定义,并在您的 AppDelegate
的 .m 中合成(或任何您调用的应用委托类),您现在可以设置此属性通过:
AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[app setColumNumber:6];
或等价的,
AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
app.columNumber = 6;
您的 DataCell
类是,根据您的明确回答,不是应用程序委托类。显然这是一些基于UIView
的课程。您可以为此DataCell
类定义自定义属性,但您不能通过[UIApplication sharedApplication]
访问这些属性。您显然将这些DataCell
对象保存在一个名为cells
的数组中。因此,如果您想设置第一个单元格的 columNumber
属性,您可以执行以下操作:
DataCell *cell = cells[0];
[cell setColumNumber:6];
当我第一次阅读这个问题时,我以为您关注的是类之间关于属性更改值的通信,KVO 对此很有用。但这是一个更高级的话题,我们现在不应该担心这一点。这只会给新开发者带来困惑。
顺便说一句,使用自动生成的 setter 方法的优点之一是它自动符合 Key-Value Observing (KVO)。 (如果您编写自己的 setter,也可以进行必要的编码以支持 KVO,但这里没有理由这样做;请使用标准 setter。)请参阅Key-Value Observing Programming Guide。归根结底,一个类可以将自己注册为另一个类的属性变化的观察者。
如果您想查看如何使用属性的示例,请考虑以下视图子类:
DetailView.h:
#import <UIKit/UIKit.h>
// public interfaces belong here
@interface DetailView : UIView
@property (nonatomic, readonly) NSInteger columnNumber; // column number set during initialization
@property (nonatomic) NSInteger tapCount; // a count of how many times we tapped on this
- (id)initWithColumnNumber:(NSInteger)column; // interface for creating DetailView
@end
DetailView.m:
#import "DetailView.h"
@implementation DetailView
const CGFloat kWidth = 40.0f;
const CGFloat kMargin = 5.0f;
const CGFloat kHeight = 300.0f;
// create view, set column number, set frame according to column number
- (id)initWithColumnNumber:(NSInteger)column
CGRect frame = CGRectMake(kMargin + column * (kWidth + kMargin), kMargin, kWidth, kHeight);
self = [super initWithFrame:frame];
if (self)
_columnNumber = column;
_tapCount = 0;
self.backgroundColor = [UIColor grayColor];
return self;
@end
然后我可以编写一个视图控制器来添加这些视图,但是当您点击一个时,它会为我们NSLog
列号并告诉我们我们点击了多少次:
#import "ViewController.h"
#import "DetailView.h"
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
for (NSInteger column = 0; column < 5; column++)
DetailView *detailView = [[DetailView alloc] initWithColumnNumber:column];
[self.view addSubview:detailView];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
action:@selector(handleTap:)];
[detailView addGestureRecognizer:tap];
- (void)handleTap:(UITapGestureRecognizer *)gesture
DetailView *detailView = (id)gesture.view;
NSAssert([detailView isKindOfClass:[DetailView class]], @"%s: Not a DetailView: %@", __FUNCTION__, detailView);
detailView.tapCount++;
NSLog(@"%s: column number = %d; tapped %d times", __FUNCTION__, detailView.columnNumber, detailView.tapCount);
@end
【讨论】:
我认为您使用[UIApplication sharedApplication] delegate]
而不是其他类访问 Application Delegate。其他类应该通过 NibName 或 alloc 访问
@nsgulliver 您如何引用另一个对象显然取决于您如何创建它。我认为尽管名称令人困惑,但 DataCell
是他的应用程序委托类。如果不是,是的,你是对的,他引用了那个类,但是他创建了它。
@rob 我怎样才能使用自动设置方法来设置我的columNumber
我认为他在声明中提到了DataCell
控制器文件,但无论如何他提供的信息非常模糊和混乱。
@Swapandroid 我添加了一个非常简单的示例。一个属性是readonly
(列号是readonly
,因为您在初始化期间设置了它,但视图控制器在事后无法更改它)和一个读写属性(tapCount
递增每次用户点击时查看控制器)。这演示了 readonly
属性的初始化、检索属性值和更新属性值。【参考方案2】:
如果您想使用 appDelegate 调用它,请将您的 MysetValue
移动到 AppDelegate
AppDelegate* appdelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[appdelegate MysetValue:6];
【讨论】:
好的,我将 MysetValue 方法放入应用程序委托中,而不是如何从应用程序委托中获取该值到我的数据 cell.m ?很抱歉问你,但我对目标 c 不熟悉 您的cell
是UITableViewCell
或UIViewController
的子类吗?以上是关于如何在不调用 [关闭] 的情况下将整数从控制器设置到子视图的主要内容,如果未能解决你的问题,请参考以下文章
如何在不使用共享首选项的情况下将数据存储为颤动的对象[关闭]
如何在不使用 curl 和 guzzle 的情况下从控制器 Laravel 调用 API,因为它不起作用 [关闭]