What I would like to do is to create UIImageView without storyboard, but failed to let it show. At first I deleted storyboard, LaunchScreen.xib and Main StoryBoard file base name from info.plist. and then what I created is as follows:
AppDelegate.h
#import <UIKit/UIKit.h>
#interface AppDelegate : UIResponder <UIApplicationDelegate>
#property (strong, nonatomic) UIWindow *window;
#end
AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor greenColor];
[self.window makeKeyAndVisible];
return YES;
}
ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
UIImage *imageData =[UIImage imageNamed:#"aaa.png"];
UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 30, 100, 100)];
myImage.image = imageData;
[self.view addSubview:myImage];
}
I am a beginner and couldn't find any solution.
Does anybody know how to solve this?
Thank you in advance.
Xcode 6.4
OSX 10.10.5
You just need to set your window's root view controller to an instance of ViewController
self.window.rootViewController = [[ViewController alloc] init];
You'll also have to import ViewController.h at the top of your AppDelegate file
Related
I want touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event to be called in a sub-classed UIView.
AppDelegate.m:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[self.window setRootViewController:[[UIViewController alloc] init]];
CGRect firstFrame = self.window.bounds;
HypnosisView *firstView = [[SubClassedView alloc] initWithFrame:firstFrame];
[self.window addSubview:firstView];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
SubClassedView.h:
#import <UIKit/UIKit.h>
#interface SubClassedView : UIView
#end
SubClassedView.m:
#import "SubClassedView.h"
#implementation SubClassedView
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
NSLog(#"Here!");
}
#end
When I touched the screen, the console didn't output "Here!" as I thought it should.
I use the newest Xcode 7 beta 5.
How can I get touchesBegan to be called in the right way?
Thank you very much.
You're adding your HypnosisView as the subview of the window, rather than as a subview of the root view controller's view. Your root view controller should be a UIViewController subclass so that you can modify its behaviour to build your app's navigation flow.
Subclass UIViewController, and add your HypnosisView as a subview in its view hierarchy:
#interface MyViewController : UIViewController
#property(nonatomic, strong) HypnosisView *hypnosisView;
#end
#implementation MyViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.hypnosisView = [[HypnosisView alloc] initWithFrame:self.view.bounds];
[self.view addSubview:hypnosisView];
}
#end
Then in your app delegate, set your view controller subclass to be the root view controller:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
MyViewController *myVC = [[MyViewController alloc] init];
[self.window setRootViewController:myVC];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
This is quite an old-school method of doing things though. Is there any reason you're not using storyboards to build your interface?
I have inherited a large code that keeps crashing during applicationDidFinishLaunchingWithOptions on [self.window makeKeyAndVisible] with EXC_BAD_ACCESS (code=2, address...), so I have no useful information on console. Through elimination I have separated a simple example below that will crash when adding navigationController view onto the baseVC.view. Can anybody please help and explain why is it crashing and how to fix it?
#interface ViewController () <UINavigationControllerDelegate>
#property (nonatomic, strong) UIViewController *baseVC;
#property (nonatomic, strong) UINavigationController *customNC;
#end
#implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.baseVC = [[UIViewController alloc] init];
CGSize size = self.view.bounds.size;
self.baseVC.view.frame = CGRectMake(0.0, 0.0, size.width, size.height );
[self.view addSubview:self.baseVC.view];
self.customNC = [[UINavigationController alloc] initWithRootViewController:self.baseVC];
[self addChildViewController:self.customNC];
[self.customNC setNavigationBarHidden:YES animated:NO];
self.customNC.delegate = self;
self.customNC.view.frame = self.baseVC.view.frame;
[self.baseVC.view addSubview:self.customNC.view];
}
#end
The actual code is I have is more complex, but the behaviour of this sample is the same. Thank you.
Edit:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = [[RootVC alloc] initWithNibName:#"RootVC" bundle:nil];
[self.window makeKeyAndVisible];
return YES;
}
self.customNC = [[UINavigationController alloc] initWithRootViewController:self.baseVC];
[self.baseVC.view addSubview:self.customNC.view];
The problem is in this code lines. So, self.baseVC.view is in self.customNC.view, and vice versa. It causes the crash.
EXC_BAD_ACCESS
This exception occurs when you have problem with memory of the app probably something is already released and you try to use it. To debug this use iOS instruments.
Try to add this line to if you do not have this didFinishLaunchingWithOptions:
[self.window addSubview:[self.navigationController view]];
[self.window makeKeyAndVisible];
I am learning objective-c and having some trouble making the top nav bar black. Here's what I have so far:
// AppDelegate.h
#import <UIKit/UIKit.h>
#interface AppDelegate : UIResponder <UIApplicationDelegate>
#property (strong, nonatomic) UIWindow *window;
#property (strong, nonatomic) UINavigationController *navigationController;
#end
// AppDelegate.m
#import "AppDelegate.h"
#implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.navigationController.navigationBar.barStyle = UIBarStyleBlackOpaque; // optional
return YES;
}
What am I doing wrong here / not understanding about this? And how would this be fixed? Is it because I'm not synthesizing the navigationController? (when do you need to synthesize something?)
This should be done in viewWillappear or didappear
By default the UINavigationBar on an iOS app is blue. Apple have some built-in styles that you can use
[self.navigationController.navigationBar setBarStyle:UIBarStyleBlackOpaque];
The options available are:
UIBarStyleBlack
UIBarStyleBlackOpaque
UIBarStyleBlackTranslucent
UIBarStyleDefault
UIBarStyleBlackOpaque and UIBarStyleTranslucent have been depreciated. You should use UIBarStyleBlack and set property ‘translucent’ to yes if needed.
You can also change the colour to any colour you wish using one of the two lines of codes below and adjusting the colour values.
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:.7 green:.5 blue:.2 alpha:1];
self.navigationController.navigationBar.tintColor = [UIColor blackColor];
try by setting the Tint
[navbar setTint color:[uicolor blackColor]];
or
navigationController.navigationBar.barTintColor = [UIColor greenColor];
If you are trying to make a application with a navigation controller stack it will usually look something like this.
//Appdelegate.h
#import <UIKit/UIKit.h>
#interface AppDelegate : UIResponder <UIApplicationDelegate>
#property (strong, nonatomic) UIWindow *window;
#end
//Appdelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
MyCustomViewController *vc = [[MyCustomViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:vc];
navigationController.navigationBar.barStyle = UIBarStyleBlack;
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];
return YES;
}
use this may be help
self.navigationController.navigationBar.tintColor = [UIColor blackColor];
I really don't know how to explain this without pasting all my code, but ill give it a shot. "Assuming" my .hs and .ms are accurate, i have a feeling my .xib is not set correctly, but i cant really paste the code from that. Instead i've zipped the files and uploaded the source code. (if you are brave enough, it's here: http://bit.ly/ZtDkGi ) Im getting a successful build, but my emulator's screen is just black after the app launches.
Essentially, i had to manually add an appDelegate object. i set the class to the appropriate class - but its still not pulling. If someone would be kind enough to help, that would be great.
here's my Test_TableViewAppDelegate.h
#import <UIKit/UIKit.h>
#interface Test_TableViewAppDelegate : NSObject <UIApplicationDelegate>
{
}
#property (nonatomic, retain) IBOutlet UIWindow *window;
#property (nonatomic, retain) IBOutlet UINavigationController *navController;
#end
here's my new Test_TableViewAppDelegate.m
#import "Test_TableViewAppDelegate.h"
#implementation Test_TableViewAppDelegate
#synthesize window=_window;
#synthesize navController=_navController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
//self.window.backgroundColor = [UIColor whiteColor];
UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
window.backgroundColor = [UIColor greenColor];
self.window = window;
UIViewController *fvc = [[UIViewController alloc] init];
UIViewController *rootController = [[UIViewController alloc] initWithNibName:#"RootViewController" bundle:nil];
UINavigationController *nc = [[UINavigationController alloc]initWithRootViewController:rootController];
//UINavigationController *nc = [[UINavigationController alloc]initWithRootViewController:fvc];
self.navController = nc;
//[self.window addSubview: nc.view];
//[self.window makeKeyAndVisible];
self.window.rootViewController = self.navController;
[self.window makeKeyAndVisible];
return YES;
}
RootViewController.h
#import <UIKit/UIKit.h>
#interface RootViewController : UITableViewController {
NSMutableArray *petsArray;
}
#end
RootViewController.m
#import "RootViewController.h"
#interface RootViewController ()
#end
#implementation RootViewController
and last but not least, main.m ( i think this might be an issue too)
#import "Test_TableViewAppDelegate.h"
int main(int argc, char *argv[])
{
#autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([Test_TableViewAppDelegate class]));
}
}
thanks in advance. i'd appreciate it :D
in your delegate Test_TableViewAppDelegate
why you adding views two times to the window?
// you could remove these two lines
[self.window addSubview: nc.view];
[self.window makeKeyAndVisible];
//keep these two lines
self.window.rootViewController = self.navController;
[self.window makeKeyAndVisible];
And this view you are adding to the navigationController it is not initalized with any nib name
UIViewController *fvc = [[UIViewController alloc] init];
initialization should be like this instead in your delegate
RootViewController *rootController = [[RootViewController alloc] initWithNibName:#"RootViewController" bundle:nil];
UINavigationController *nc = [[UINavigationController alloc]initWithRootViewController:rootController];
I believe the reason that you're getting a black screen is that you are not properly allocating and initializing your navigation controller!
Instead, you should try this code:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
{
// create the base window
UIWindow *window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
window.backgroundColor = [UIColor greenColor];
self.window = window;
[window release];
// this is the home page from the user's perspective
FirstViewController *fvc = [[FirstViewController alloc] init];
UINavigationController *nc = [[UINavigationController alloc]initWithRootViewController:fvc];
self.navigationController = nc;
[fvc release];
[nc release];
// show them
[self.window addSubview: nc.view];
[self.window makeKeyAndVisible];
return YES;
}
Hope this works!
update 0
Hold off on answering this question.
I think I have found part of the problem.
XCode aborted again when I tried to rename the automatically generated .xib files it had created with _ to use ~. Xcode seems to destroy at least one of the .xib files when it aborts, and that file contains the minimal view or window object needed by the app. Although the missing .xib file is gone from the Finder, it still shows in the Navigator.
So now, I am going to leave the _ files alone and try again, but not use the suggestion I got earlier.
update 0
I am having trouble with my xibs having changed the following code as recommended here.
I suspect the problem comes from changing the xib names to using '~' instead of '_' and not being able to revise the corresponding code which refers to the xib names.
The problem could also be that I have the following 4 filenames which could be confusing to Xcode?
BSViewController.h/.m
BSViewController~iPhone.xib
BSViewController~iPad.xib
Original code was.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
self.viewController = [[BSViewController alloc] initWithNibName:#"BSViewController_iPhone" bundle:nil];
} else {
self.viewController = [[BSViewController alloc] initWithNibName:#"BSViewController_iPad" bundle:nil];
}
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
Altered code (including extra) is.
#import "BSAppDelegate.h"
#import "BSViewController.h"
#implementation BSAppDelegate
#synthesize window;
#synthesize viewController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[BSViewController alloc] initWithNibName:#"BSViewController" bundle:nil];
[self.window addSubview:viewController.view];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
BSAppDelegate.h follows.
#import <UIKit/UIKit.h>
#class BSApp;
#class BSViewController;
#interface BSAppDelegate : NSObject <UIApplicationDelegate>{
UIWindow *window;
BSViewController *viewController;
}
#property (retain, nonatomic) IBOutlet UIWindow *window;
#property (retain, nonatomic) IBOutlet BSViewController *viewController;
#end
BSViewController.h follows.
#import <UIKit/UIKit.h>
#interface BSViewController : UIViewController<UIImagePickerControllerDelegate, UINavigationControllerDelegate> {
UIImage *workingImage;
IBOutlet UIImageView *imageView;
}
#property (nonatomic, retain) UIImage *workingImage;
#property (nonatomic, retain) IBOutlet UIImageView *imageView;
+ (BOOL)isCameraDeviceAvailable;
- (IBAction) chooseImage:(id) sender;
- (IBAction) grayscale:(id) sender;
#end
BSViewController.m follows.
#import "BSViewController.h"
#interface BSViewController ()
#end
#implementation BSViewController
#synthesize imageView;
#synthesize workingImage;
+(BOOL)isCameraDeviceAvailable
{
BOOL isCameraAvailable=NO;
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront] )
isCameraAvailable = YES;
}
return isCameraAvailable;
}
- (IBAction) chooseImage:(id) sender {
[self.view addSubview: self.imageView];
UIImage* testCard = [UIImage imageNamed:#"ipad 7D.JPG"];
CGImageRef num = CGImageCreateWithImageInRect([testCard CGImage],CGRectMake(532, 0, 104, 104));
UIGraphicsBeginImageContext(CGSizeMake( 250,650));
CGContextRef con = UIGraphicsGetCurrentContext();
CGContextDrawImage(con, CGRectMake(0, 0, 13, 13) ,num);
UIImage* im = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGImageRelease(num);
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
self.workingImage = [info objectForKey:UIImagePickerControllerOriginalImage];
[imageView setImage:self.workingImage];
[picker dismissViewControllerAnimated:YES completion:nil];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
self.imageView = nil;
}
- (void)dealloc {
[workingImage release];
[imageView release];
[super dealloc];
}
#end
I am using Xcode 4.5.2 and designing for iOS 6.
In my BSViewController~iPad.xib I have added a "ViewController" object which upon control-clicking produces 2 Outlets: "searchDisplayController" and "view". There is no "view" top-level object; when I try to drag the "+" to the "File's Owner" I get no result and probably shouldn't.
In my BSViewController~iPhone.xib I have already a "Window" object, and don't know if that is good or needs to be also added to the the ~iPad.xib (but I don't know how).