0

我有一个在 xib 中设计的带有 UITableView *myTable 和 MKMapView *myMap 的 ViewController,但是表委托/数据源和地图委托在另一个名为 SubClass 的类中。当我在 ViewController 中按下一个按钮时,子类从 xml 远程文件中解析表格单元的纬度和经度,现在我想在每次选择 myTable 的行时将 myMap 缩放到这个坐标:嗯,我找不到方法从子类调用这个缩放。这是,简化,我的代码:

视图控制器.h

// ViewController.h

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import "SubClass.h"

@interface ViewController : UIViewController {
    IBOutlet UITableView *myTable;
    IBOutlet MKMapView *myMap;
    SubClass *subClassIstance;
}

- (void)buttonPressed:(id)sender
@property (nonatomic, retain) IBOutlet MKMapView *myMap;

视图控制器.m

// in ViewController.m

- (void)buttonPressed:(id)sender {
    subClassIstance = [[SubClass alloc] init];
    myTable.delegate = SubClass;
    myTable.dataSource = SubClass;
    [myTable reloadData];

    subClassIstance = [[SubClass alloc] loadMap:myMap];
}

子类.h

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface SubClass : NSObject <UITableViewDataSource, UITableViewDelegate, MKMapViewDelegate> {
}

- (void)loadValues;
- (id)loadMap:(MKMapView *)mapView;
- (id)zoomTheMap:(NSMutableString *)string1 :(NSMutableString *)string2 :(MKMapView *)mapView; // IS IT RIGHT???

子类.m

- (id)init{
    self = [super init];
 if ( self != nil ) {
     [self loadValues];
 }
    return self;
}

- (void)loadValues {

  // CODE TO PARSE VALUES OF LONGITUDE AND LATITUDE TO PASS IN THE TABLE CELLS
 latitudeFromLoadValues = // NSMutableString parsed value from a xml remote file
 longitudeFromLoadValues = // NSMutableStringparsed value from a xml remote file
}

- (id)loadMap:(MKMapView *)mapView
{
    if (self) {
    mapView.delegate = self; // CODE TO LOAD ANNOTATIONS AND OTHER STUFF. IT WORKS!
    }
    return self;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
latitudeFromLoadValues = [dataParsed objectAtIndex:indexPath.row];
longitudeFromLoadValues = [data2Parsed objectAtIndex:indexPath.row];
[self zoomTheMap:latitudeFromLoadValues :longitudefromLoadValues :???]; // IS IT CORRECT? WHAT IS THE RIGHT *MKMAPVIEW?
}

- (id)zoomTheMap:(NSMutableString *)string1 :(NSMutableString *)string2 :(MKMapView *)mapView {

    NSLog(@"%@",string1);
    NSLog(@"%@",string2);

    MKCoordinateRegion region;
    region.center.latitude = [string1 floatValue];
    region.center.longitude = [string2 floatValue];
    region.span.latitudeDelta = 2.0;
    region.span.longitudeDelta = 2.0;

    // I KNOW, I HAVE TO CALL myMap from ViewController! But with an istance?

    mapView.delegate = self;
    mapView.region = region;    

    return self;
}

好吧,其余的代码工作!我可以看到 ViewController 中的 *myMap 加载了在 SubClass 中声明的一些注释,并且 *myTable 加载了填充有在 SubClass 中解析的纬度和经度的单元格;我还可以看到在 string1 和 string2 中传递的正确经度和纬度,但是当我选择单个表格单元格时,我没有看到 myMap 缩放,我认为我使用了错误的方法。你能帮帮我吗?

4

2 回答 2

1

loadMap不应该 return self,只有 init 方法应该这样做。在buttonPressed你分配一个新的子类,对它做一些事情,然后分配另一个子类并调用它的loadMap函数。最后一行应该是[subClassIstance loadMap:myMap],但您还需要在每次按下该按钮时重新考虑分配一个新的子类。

我认为你真的走错了路。为什么需要一个子类(BTW 的名字很糟糕,它没有说明它的用途)?它扩展了什么类?如果 ViewController 有 MKMapView,它通常是向地图发出命令的那个。我可以理解您对 tableview 有一个单独的数据源,但其余的没有。如果您使 VC 成为自己的表和映射委托,您将简化很多事情。

如果你真的想在你的代码中有一个子类,那么你应该在你在 buttonPressed 的第一行创建的实例上调用 loadMap

- (void)buttonPressed:(id)sender {
    subClassIstance = [[SubClass alloc] init];
    myTable.delegate = SubClass;
    myTable.dataSource = SubClass;
    [myTable reloadData];

    [subClassIstance loadMap:myMap];
}

你的 loadMap 看起来像

- (void)loadMap:(MKMapView *)mapView
{
    mapView.delegate = self; 
}

但是,如果这就是 loadMap 的全部内容,您是否不需要为此功能,您可以让 buttonPressed 完成所有操作。

- (void)buttonPressed:(id)sender {
    subClassIstance = [[SubClass alloc] init];
    myTable.delegate = SubClass;
    myTable.dataSource = SubClass;
    [myTable reloadData];

    myMap.delegate = subClassIstance;
}

初始化函数示例:

- (id)initiWithMapView: (MKMapView)* mapView
{
    self = [super init];
    if(self)
    {
       theMap = mapView;
       theMap.delegate = self;
       [self loadValues];
       ....
    }
    return self;
 }

如果您使用它,您将不必一直设置地图委托或返回 self ,并且您可以在每个函数中使用 theMap (如您的答案中所声明的)。

于 2012-10-21T01:30:53.860 回答
0

好吧,对于那些感兴趣的人,我找到了一个简单的解决方案:首先,我在我的 SubClass.h 中定义了一个通用的 MKMapView *theMap,现在看起来像:

#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>

@interface SubClass : NSObject <UITableViewDataSource, UITableViewDelegate, 

MKMapViewDelegate> {
        MKMapView *theMap // NEW CODE!!!
    }

- (void)loadValues;
- (id)loadMap:(MKMapView *)mapView;
- (id)zoomTheMap:(NSMutableString *)string1 :(NSMutableString *)string2 :(MKMapView *)mapView;

在 loadMap 方法中,我将 *theMap 与 VC 中的 SubClassIstance 调用的 mapView 进行了比较(我想要缩放的 *myMap),所以现在我们有了:

- (id)loadMap:(MKMapView *)mapView
{
    if (self) {
    mapView.delegate = self; 
    theMap = mapView; // NEW CODE !!!

    // CODE TO LOAD ANNOTATIONS AND OTHER STUFF. IT WORKS!
    }
    return self;
}

在 didSelectRowAtIndexPath 我已将 *theMap 作为 zoomTheMap 方法的 mapView 参数传递:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
latitudeFromLoadValues = [dataParsed objectAtIndex:indexPath.row];
longitudeFromLoadValues = [data2Parsed objectAtIndex:indexPath.row];
[self zoomTheMap:latitudeFromLoadValues :longitudefromLoadValues :theMap]; // NEW CODE !!!
}

zoomTheMap 方法没有改变,现在,“神奇地”,每次我按下表格的一行时,在 VC xib 中设计的 *myMap(但在 SubClass 中有委托)都会放大存储在单元格中的坐标:

- (id)zoomTheMap:(NSMutableString *)string1 :(NSMutableString *)string2 :(MKMapView *)mapView {

    MKCoordinateRegion region;
    region.center.latitude = [string1 floatValue];
    region.center.longitude = [string2 floatValue];
    region.span.latitudeDelta = 2.0;
    region.span.longitudeDelta = 2.0;

    mapView.delegate = self; // here mapView is *theMap passed in didSelectRowAtIndexPath, AKA original mapView istance used to delegate *myMap in VC
    [mapView setRegion:region animated:YES];   

    return self;
}

也许它不是一种“优雅”的方式,但它现在有效!;=)

于 2012-10-22T08:44:23.143 回答