Obj-C / Использование MapKitView и TableView вместе с делегированием - PullRequest
0 голосов
/ 22 октября 2018

Я очень новичок в цели 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...