[英]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.