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]

希望这对您有所帮助!!!!!