Я очень новичок в цели c, и я хотел создать сцену об использовании 2 дочерних контроллеров представления в главном контроллере представления, который включает MapKit и TableView.Я искал его в Интернете в течение 1 дня, но я не мог найти какое-либо решение, так как мне не удавалось выполнить разные шаги каждого предложения.Я знаю, что существует много способов передачи данных между контроллерами представления, и я подумал, что в этой ситуации лучше всего использовать логику делегирования.(дайте мне знать, если я ошибаюсь, пожалуйста).Кстати, я могу обновить или переместить курсор в определенное место, КОГДА я установил фиктивную кнопку на MapKitViewController, так что часть MapKit не там, где я терплю неудачу.Я уверен, что проблема в связи между двумя контроллерами вида, которые активны одновременно.
Проблема:
- Обновление MapView, щелкнув строку таблицы в TableView, которая содержит подробные координаты местоположения.Оба дочерних представления устанавливаются на MasterViewController двумя контейнерами.
До сих пор пробовали:
- Создан метод "
goToLocation:(Location*) location
"в MapViewController и отправил параметры этому методу из TableViewController.=> ( Параметры Lat и Long, полученные goToLocation (), но MapKitView не обновляется ) - Попытка создать логику делегата между MapView и TableView. => ( Возможно, я не смог создать его должным образом. См. Ниже )
Что я хочу:
- Я хочу знать, какую часть я делаю неправильно.Есть ли простой или правильный способ добиться этого?
TableViewController.h
@class TableViewController; //define class
@protocol TableViewDelegate <NSObject> //define delegate protocol
//define delegate method to be implemented within another class
- (void) locationSelected: (TableViewController *) sender object:(Location *) location;
@end
@property (nonatomic, weak) id <TableViewDelegate> delegate; //define TableViewVCDelegate as delegate
TableViewController.m
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
[self notifyNow:[_locations objectAtIndex:indexPath.row]];
}
- (void) notifyNow:(Location *) location {
//this will call the method implemented in your other class
[self.delegate locationSelected:self object:(Location *) location];
NSLog(@"Selected: %@",[location name]);
}
MapViewController.h
//make it a delegate for TableViewVCDelegate
@interface MapViewController : UIViewController <TableViewDelegate>
MapViewController.m
- (void)viewDidLoad {
_tableViewController = [[TableViewController alloc]init];
_tableViewController.delegate = self; //set its delegate to self somewhere
}
!!_ This Method Doesn't Get Triggered _!!
- (void)locationSelected:(TableViewController *)sender object:(Location *)location {
NSLog(@"%@ is great!", [location name]);
}
MainViewController.m (Master/ Root View Controller)
#import "MainViewController.h"
#import "MapViewController.h"
#import "TableViewController.h"
@interface MainViewController ()
@property (strong, nonatomic) IBOutlet UIView *topCont;
@property (strong, nonatomic) IBOutlet UIView *bottomCont;
@property (strong, nonatomic) IBOutlet UIView *safeArea;
@end
@implementation MainViewController
MapViewController *mapViewVC;
TableViewController *tableViewVC;
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[self.navigationController setNavigationBarHidden:YES animated:YES];
tableViewVC = [self.storyboard instantiateViewControllerWithIdentifier:@"TableViewController"];
mapViewVC = [self.storyboard instantiateViewControllerWithIdentifier:@"TopChildVC"];
[self addChildViewController:tableViewVC];
[tableViewVC.view setFrame:CGRectMake(0.0f,
0.0f,
self.safeArea.frame.size.width,
self.safeArea.frame.size.height/2)];
[self.bottomCont addSubview:tableViewVC.view];
[tableViewVC didMoveToParentViewController:self];
[self addChildViewController:mapViewVC];
[mapViewVC.view setFrame:CGRectMake(0.0f,
0.0f,
self.safeArea.frame.size.width,
self.safeArea.frame.size.height/2)];
[self.topCont addSubview:mapViewVC.view];
[mapViewVC didMoveToParentViewController:self];
}
@end