簡體   English   中英

iOS-如何從容器視圖訪問變量並將其傳遞回視圖控制器

[英]iOS - how to get access to a variable from the container view and pass it back to the view controller

我有一個“viewContoller” VC1並在它的容器視圖嵌入在VC1表視圖控制器。

我有一個名為number的變量,該變量根據didSelectRowAtIndexPath進行didDeselectRowAtIndexRowPath從表中扣除didDeselectRowAtIndexRowPath的值。

- (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];
}

這個“數字”值屬於嵌入式表控制器,我需要在VC1中訪問它。

另外,“數字”變量會根據被選擇或取消選擇而不斷變化,並且VC1需要知道何時發生這種情況,因此它具有最新的值。

我一直在尋找解決方案好幾天了,任何幫助將不勝感激。

很簡單,執行以下操作,

1)轉到界面生成器,並將名稱設置為您的UIContainerView embed的名稱(讓我們說“ abc ”)。 稍后,我們將從VC1中訪問它(在步驟4中)。


2)在VC1標頭中定義您的number變量。


3)在表格視圖控制器標頭中,像這樣定義對VC1的引用,

@property(nonatomic, retain) VC1 *VC;

4)在VC1類中,實現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)現在,在表格視圖控制器中,您可以訪問如下所示的數字變量,

- (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標頭中定義的。 請記住,這只是滿足您的要求的一種方法。有幾種方法可以處理這種情況。 例如,如果您願意,也可以采取其他方法。

如果我的問題正確無誤,則您在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

然后在您的選擇方法中,您可以執行以下操作:

- (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上,您只需要將委托分配給self。 tableViewInstance.delegate = self;

不要忘記將委托包括在標頭<SpecialTableViewFunctionDelegate>

這樣,當您選擇/取消選擇單元格時,系統會通知您

可以通過多種方式完成不同類之間的數據共享,但是最干凈的方法是通過遵循松散耦合的設計,將共享數據保留在所有使用/修改此值的類之外。 可以想到一個Singleton類,但是如果我們只共享一個屬性(值),那將是一種過度使用的情況。在這種情況下,我們可以有一個帶有一個內部靜態變量的類和一個帶有+符號的類方法。訪問它。 這是相同的代碼:

.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 SharedData類僅在@implementation之前導入它的用法

[SharedData incrementNumber]

希望這對您有幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM