iOS - 如何从容器视图访问变量并将其传递回视图控制器
iOS - how to get access to a variable from the container view and pass it back to the view controller
我有一个 'viewContoller' VC1 和一个容器视图,其中 table 视图控制器嵌入 VC1。
我有一个名为 number 的变量,它根据 didSelectRowAtIndexPath
相加并使用 didDeselectRowAtIndexRowPath
进行扣除,因为它是 table。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
}
此 "number" 值属于嵌入式 table 控制器,我需要在 VC1.
中访问它
此外,"number" 变量会根据它被选中或取消选择而不断变化,VC1 需要知道何时发生这种情况,以便它具有最新的值。
几天来我一直在寻找解决方案,如有任何帮助,我们将不胜感激。
很简单,按照下面的方法做,
1) 转到界面构建器并将名称设置为 UIContainerView 嵌入的序列(假设为“abc
”)。稍后我们将从 VC1 访问它(在步骤 4 中)。
2) 在 VC1 header.
中定义您的 number
变量
3) 在 table 视图控制器中 header 像这样定义对 VC1 的引用,
@property(nonatomic, retain) VC1 *VC;
4) 在 VC1 class 中,实现 prepareForSegue
并执行以下操作,
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSString * segueName = segue.identifier;
if ([segueName isEqualToString: @"abc"]) {
TableViewController *tblVC = (TableViewController *) [segue destinationViewController];
tblVC.VC = self;
}
}
5) 现在在 table 视图控制器中,您可以访问您的数字变量,如下所示,
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.VC) {
self.VC.number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
}
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.VC) {
self.VC.number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
}
}
现在您可以从 VC1
访问 number
变量,因为它是在 VC1
header 中定义的。请记住,这只是实现您的要求的一种方法,有多种方法可以处理这种情况。比如,如果你愿意,你也可以做其他事情。
如果我没答错你的问题,你在 VC 中有一个 tableView 并且你想在用户 didSelect/DidDeselect 一行时更新。
另一种解决方案是实现协议。
@protocol SpecialTableViewFunctionDelegate <NSObject>
@optional
- (void)didSelectSomethingUpdatedNumber:(NSNumber *)number;
- (void)didDeselectSomethingUpdatedNumber:(NSNumber *)number;
@end
这当然是假设您继承了 tableView。
在您的 tableView 子类中,您可以添加委托,例如:
@interface tableviewSubclass :UITableView
@property (nonatomic, weak)id<SpecialTableViewFunctionDelegate>delegate;
@end
然后在您执行的 select 方法中,您可以执行以下操作:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
if(_delegate){
if([_delegate respondsToSelector:(@selector(didSelectSomethingUpdatedNumber:)]){
[_delegate didSelectSomethingUpdatedNumber:number];
}
}
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
if(_delegate){
if([_delegate respondsToSelector:(@selector(didDeselectSomethingUpdatedNumber:)]){
[_delegate didDeselectSomethingUpdatedNumber:number];
}
}
}
}
然后在您的 VC 上,您只需将委托分配给自己。
tableViewInstance.delegate = self;
不要忘记将委托包括在 header <SpecialTableViewFunctionDelegate>
这样当有select/deselect个单元格
时你会收到通知
可以通过多种方式在不同的 class 之间共享数据,但最简洁的方法是将共享数据保留在 using/modifying 的所有 class 之外这个值遵循松耦合设计。
人们可以想到一个 Singleton class,但是如果我们只有一个 属性(值)是 shared.In,那将是一种过度使用,在这种情况下我们可以有一个 class使用一个内部静态变量和 class 方法(带 + 号)来访问它。这是相同的代码:
.h file--->
#import <Foundation/Foundation.h>
@interface SharedData : NSObject
+(void)resetNumber;
+(void)incrementNumber;
+(void)decrementNumber;
+(int)getNumber;
@end]
.m 文件 --->
#import "SharedData.h"
@implementation SharedData
static int number;
+(void)resetNumber {
number = 0;
}
+(void)incrementNumber {
number++;
}
+(void)decrementNumber {
number--;
}
+(int)getNumber {
return number;
}
@end
下面是class的用法
使用@class SharedData 仅在@implementation
之前导入它
[SharedData incrementNumber]
希望这对您有所帮助!!!!!
我有一个 'viewContoller' VC1 和一个容器视图,其中 table 视图控制器嵌入 VC1。
我有一个名为 number 的变量,它根据 didSelectRowAtIndexPath
相加并使用 didDeselectRowAtIndexRowPath
进行扣除,因为它是 table。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
}
此 "number" 值属于嵌入式 table 控制器,我需要在 VC1.
中访问它此外,"number" 变量会根据它被选中或取消选择而不断变化,VC1 需要知道何时发生这种情况,以便它具有最新的值。
几天来我一直在寻找解决方案,如有任何帮助,我们将不胜感激。
很简单,按照下面的方法做,
1) 转到界面构建器并将名称设置为 UIContainerView 嵌入的序列(假设为“abc
”)。稍后我们将从 VC1 访问它(在步骤 4 中)。
2) 在 VC1 header.
中定义您的number
变量
3) 在 table 视图控制器中 header 像这样定义对 VC1 的引用,
@property(nonatomic, retain) VC1 *VC;
4) 在 VC1 class 中,实现 prepareForSegue
并执行以下操作,
- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSString * segueName = segue.identifier;
if ([segueName isEqualToString: @"abc"]) {
TableViewController *tblVC = (TableViewController *) [segue destinationViewController];
tblVC.VC = self;
}
}
5) 现在在 table 视图控制器中,您可以访问您的数字变量,如下所示,
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.VC) {
self.VC.number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
}
}
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.VC) {
self.VC.number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
}
}
现在您可以从 VC1
访问 number
变量,因为它是在 VC1
header 中定义的。请记住,这只是实现您的要求的一种方法,有多种方法可以处理这种情况。比如,如果你愿意,你也可以做其他事情。
如果我没答错你的问题,你在 VC 中有一个 tableView 并且你想在用户 didSelect/DidDeselect 一行时更新。
另一种解决方案是实现协议。
@protocol SpecialTableViewFunctionDelegate <NSObject>
@optional
- (void)didSelectSomethingUpdatedNumber:(NSNumber *)number;
- (void)didDeselectSomethingUpdatedNumber:(NSNumber *)number;
@end
这当然是假设您继承了 tableView。
在您的 tableView 子类中,您可以添加委托,例如:
@interface tableviewSubclass :UITableView
@property (nonatomic, weak)id<SpecialTableViewFunctionDelegate>delegate;
@end
然后在您执行的 select 方法中,您可以执行以下操作:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
number += [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
if(_delegate){
if([_delegate respondsToSelector:(@selector(didSelectSomethingUpdatedNumber:)]){
[_delegate didSelectSomethingUpdatedNumber:number];
}
}
}
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
number -= [[[self.sports objectAtIndex:indexPath.row] valueForKey:@"sportNumber"] intValue];
if(_delegate){
if([_delegate respondsToSelector:(@selector(didDeselectSomethingUpdatedNumber:)]){
[_delegate didDeselectSomethingUpdatedNumber:number];
}
}
}
}
然后在您的 VC 上,您只需将委托分配给自己。
tableViewInstance.delegate = self;
不要忘记将委托包括在 header <SpecialTableViewFunctionDelegate>
这样当有select/deselect个单元格
时你会收到通知可以通过多种方式在不同的 class 之间共享数据,但最简洁的方法是将共享数据保留在 using/modifying 的所有 class 之外这个值遵循松耦合设计。 人们可以想到一个 Singleton class,但是如果我们只有一个 属性(值)是 shared.In,那将是一种过度使用,在这种情况下我们可以有一个 class使用一个内部静态变量和 class 方法(带 + 号)来访问它。这是相同的代码:
.h file--->
#import <Foundation/Foundation.h>
@interface SharedData : NSObject
+(void)resetNumber;
+(void)incrementNumber;
+(void)decrementNumber;
+(int)getNumber;
@end]
.m 文件 --->
#import "SharedData.h"
@implementation SharedData
static int number;
+(void)resetNumber {
number = 0;
}
+(void)incrementNumber {
number++;
}
+(void)decrementNumber {
number--;
}
+(int)getNumber {
return number;
}
@end
下面是class的用法 使用@class SharedData 仅在@implementation
之前导入它[SharedData incrementNumber]
希望这对您有所帮助!!!!!