gpt4 book ai didi

ios - 从 UITableView 选定索引更新 detailDescriptionLabel 数据

转载 作者:行者123 更新时间:2023-11-28 22:51:10 25 4
gpt4 key购买 nike

我有一个用于 iPad 的 Split View Controller ,左侧有一个向下钻取表。我能够毫无问题地通过向下钻取填充表格,但我似乎无法获得我在左侧 UITableView 中单击的项目以显示在右侧的 detailDescriptionLabel 中。

我的 ProductViewController.m 中有以下代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];

NSLog(@"Row clicked: %i", indexPath.row);

if (_delegate != nil) {
Product *product = (Product *) [_products objectAtIndex:indexPath.row];
[_delegate productSelectionChanged:product];
}

DetailedVC *detailView = [[DetailedVC alloc] initWithNibName:@"DetailedVC" bundle:[NSBundle mainBundle]];
NSLog(@"User clicked on: %@", [NSString stringWithFormat:@"%d",indexPath.row]);
detailView.detailDescriptionLabel.text = [NSString stringWithFormat:@"%d",indexPath.row];
[self.navigationController pushViewController:detailView animated:YES];
}

这里发生的是我将 DetailedVC 插入左侧的 TableView ,我真正想要做的是在右侧的详细 View 中看到更新的行。我能够在日志窗口中看到我点击了某个索引,所以我知道我正在捕获点击事件并获取一个值。

在我的 DetailedVC.m 中,我有以下代码来更新这个标签。

- (void)viewDidLoad
{
[super viewDidLoad];
[self configureView];
}

- (void) configureView {

if (self.detailItem) {

self.detailDescriptionLabel.text = [self.detailItem description];

NSLog(@"Item: %@", [self.detailItem description]);
}
}

如果我编辑 viewDidLoad,我会得到 [self.detailItem description] 的 (null)

- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"Detail description label: %@", [self.detailItem description]);
}

ProductViewController.h

@interface ProductViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {

NSMutableArray *_products;
UITableView *_productsTableView;
id<ProductSelectionDelegate> _delegate;
}

@property (nonatomic, strong) IBOutlet UITableView *productsTableView;
@property (nonatomic, retain) NSMutableArray *products;
@property (nonatomic, assign) id<ProductSelectionDelegate> delegate;

@end

AppDelegate.h

@class ProductViewController;
@class DetailedVC;

@interface TabAndSplitAppAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
UIWindow *window;
UITabBarController *tabBarController;
ProductViewController *_productViewController;
DetailedVC *_detailedViewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet ProductViewController *productViewController;
@property (nonatomic, retain) IBOutlet DetailedVC *detailedViewController;

@end

AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

NSMutableArray *products = [NSMutableArray array];
[products addObject:[[Product alloc] initWithName:@"Product 1 Name" desc:@"Product 1 Description"]];
_detailedViewController.product = [products objectAtIndex:0];

// Override point for customization after app launch.
//create split view controller
RootVC *rvc=[[RootVC alloc] init];
rvc.title=@"Root VC";
DetailedVC *dvc=[[DetailedVC alloc] init];
dvc.title=@"Detailed VC";
_productViewController.delegate = _detailedViewController;

MySplitViewController *msc = [[MySplitViewController alloc] initwithLeftVC:rvc rightVC:dvc];
msc.title=@"First";
//create a temporary VC to show in second tab
SecondViewController *vc2 = [[SecondViewController alloc] init];
vc2.title=@"Second";

//make an array containing these two view controllers
NSArray *viewControllers = [NSArray arrayWithObjects:msc,vc2,nil];
[tabBarController setViewControllers:viewControllers];
tabBarController.view.backgroundColor=[UIColor blackColor];

for(UITabBarItem*t in tabBarController.tabBar.items)
{
t.image=[UIImage imageNamed:@"icon.png"];
t.badgeValue=[NSString stringWithFormat:@"%d",([tabBarController.tabBar.items indexOfObject:t]+1)];
}

//the views are retained their new owners, so we can release
[rvc release];
[dvc release];
[msc release];
[vc2 release];

// Add the tab bar controller's current view as a subview of the window
[self.window addSubview:tabBarController.view];
[self.window makeKeyAndVisible];

return YES;
}

MySplitViewController.h

#import <UIKit/UIKit.h>

@interface MySplitViewController : UIViewController
{
UINavigationController *leftController;
UINavigationController *rightController;
}

@property (nonatomic, retain) UINavigationController *leftController;
@property (nonatomic, retain) UINavigationController *rightController;

- (void)layoutViews:(UIInterfaceOrientation)orientation initialVerticalOffset:(float)offset;

- (MySplitViewController*) initwithLeftVC:(UIViewController*)leftvc rightVC:(UIViewController*)rightvc;
@end

MySplitViewController.m

- (MySplitViewController*) initwithLeftVC:(UIViewController*)leftvc rightVC:(UIViewController*)rightvc
{
if(self=[super init])
{
UINavigationController *lnc=[[UINavigationController alloc] initWithRootViewController:leftvc];
lnc.navigationBarHidden=NO;
self.leftController=lnc;
[lnc release];

UINavigationController *rnc=[[UINavigationController alloc] initWithRootViewController:rightvc];
rnc.navigationBarHidden=NO;
self.rightController=rnc;
[rnc release];
}
return self;
}

产品.h

#import <Foundation/Foundation.h>

@interface Product : NSObject {

NSString *_productID;
NSString *_productDescription;
}

@property (nonatomic, copy) NSString *productID;
@property (nonatomic, copy) NSString *productDescription;

- (Product *)initWithName:(NSString *)productID desc:(NSString *)productDescription;

@end

产品.m

#import "Product.h"

@implementation Product

@synthesize productID = _productID;
@synthesize productDescription = _productDescription;

- (Product *)initWithName:(NSString *)productID desc:(NSString *)productDescription {

if ((self = [super init])) {

self.productID = productID;
self.productDescription = productDescription;
}

return self;
}

@end

最佳答案

好的,请在 ProductViewController 中试试这个:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView deselectRowAtIndexPath:indexPath animated:YES];

NSLog(@"Row clicked: %i", indexPath.row);

Product *product = (Product *) [_products objectAtIndex:indexPath.row];
NSLog(@"Product: %@", product);

TabAndSplitAppAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSLog(@"appDelegate: %@", appDelegate);
UITabBarController *tbc = appDelegate.tabBarController;
NSLog(@"tbc: %@", tbc);
MySplitViewController *msvc = tbc.selectedViewController;
NSLog(@"msvc: %@", msvc);
UINavigationController *rnc = msvc.rightController;
NSLog(@"rnc: %@", rnc);
DetailedVC *dvc = rnc.topViewController;
NSLog(@"dvc: %@", dvc);

dvc.detailDescriptionLabel.text = @"We found our DetailedVC";

[dvc productSelectionChanged:product];
}

此代码不是您应如何正确构建程序的示例。这只是为了帮助我(和你)理解你的 View Controller 层次结构。

在选择产品时通知代表的最初想法是正确的,但它在您的情况下不起作用,因为对象没有正确连接。不过,您应该尝试这样做。在您发布的代码中,我没有看到 ProductViewControllerDetailedVC 都直接可见的位置,因此您可以直接说

productViewControllerInstance.delegate = detailedVCinstance;

最接近的是在 AppDelegate 中,您有 RootVC 实例 rvc,大概最终会创建 ProductViewController dvc。也许您可以将 dvc 提供给 rvc,以便它可以在创建时将其设置为 ProductViewController 的委托(delegate)。祝你好运!

关于ios - 从 UITableView 选定索引更新 detailDescriptionLabel 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11973637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com