Reputation: 32071
I have two view controllers, class A
and class B
. Class B
is a subclass of class A
. Class B
has a UITableView
defined, and in the parent class A
, I want to be able to [table reloadData]
. So I want to access a member variable of class B
from parent class A
. I tried doing the whole forward declaration thing but that didn't work out. In class B
, I put @class A
. And then in my class A
, I tried declaring a class B
object to access the table like this: B *bView=[B alloc] init]; [bView.table reloadData] //doesn't work, I get error: Receiver B is a forward class and corresponding @interface may not exist
So not sure why that's not working, but maybe I shouldnt even be doing it like this. Since its a parent class, is there a better way to access child member variables?
Upvotes: 0
Views: 155
Reputation: 17382
The parent gets no implicit access to its childs member variables. So from A's point of view B is any old object.
If B is a subclass of A then you should be doing this in B.h
#import "A.h"
@interface B:A
{
...
}
@property (readwrite,retain) UITableView *table;
And if you wish to use B in A then you can do this in "A.h" in case where you want a B member
@class B
@interface A:Foo
{
B* bar;
}
Or don't bother with the forward declaration if you don't want a B member
In both cases in A.m
#import "B.h"
You can also use #include guards to stop double imports.
#ifndef AHEADER_H
#define AHEADER_H
@interface A:Foo
...
@end
#endif
No matter how many times you use #import A.h
it will only get imported once.
Upvotes: 2
Reputation: 5200
You should not need to do this. Why not just reload the table in the subclass implementation? You can override Class A's methods in Class B if you want to add some new behaviors to existing code.
Upvotes: 0