Skocz do zawartości

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Zdjęcie
- - - - -

Objective-C i NSWindow


  • Zaloguj się, aby dodać odpowiedź
10 odpowiedzi w tym temacie

#1 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 19 marca 2011 - 23:28

Próbuję przy pomocy tego języka stworzyć proste okno, bez niczego tylko żeby się pokazało. Korzystam do tego celu z klasy NSWindow, ale mam problem ponieważ wyrzuca mi błąd.
Mój kod to:
NSWindow *myWindow;
	NSRect rect = NSMakeRect (100, 100, 200, 200);
	unsigned int styleMask = NSTitledWindowMask | NSMiniaturizableWindowMask;
////////// poniższa linijka wywołuje błąd//////////////////
myWindow =[ [NSWindow alloc] initWithContentRect: rect styleMask: styleMask backing: NSBackingStoreBuffered
									   defer: NO];
Błąd to

Undefined symbols:
"_OBJC_CLASS_$_NSWindow", referenced from:
objc-class-ref-to-NSWindow in Tutorial.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

Nie wiem o co chodzi bardzo bym prosił o klarowne wyjaśnienie potrafię tworzyć takie okienka korzystając z języka Javy lub C#. Czy w tym przypadku okno tworzy się podobnie?

#2 Roberto

Roberto
  • 13 752 postów
  • SkądWrocław

Napisano 19 marca 2011 - 23:45

dodałeś AppKit.framework do projektu? poza tym - który template wybrałeś 'na start' z okienkami?

#3 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 20 marca 2011 - 12:46

Próbuję od podstaw zbudować aplikacje okienkową (ze startu wybieram aplikacje konsolową), nie dodałem tego framework'u ale już to poprawiłem, jednak teraz nie uruchamia się (działa ale nic się nie dzieje muszę "brutalnie" wyłączać aplikacje)
Wyciąg z konsoli

Sun Mar 20 12:43:25 user-46-113-138-97.play-internet.pl Tutorial[664] : kCGErrorInvalidConnection: CGSGetCurrentCursorLocation: Invalid connection
Sun Mar 20 12:43:25 user-46-113-138-97.play-internet.pl Tutorial[664] : kCGErrorFailure: Set a breakpoint @ CGErrorBreakpoint() to catch errors as they are logged.
Sun Mar 20 12:43:25 user-46-113-138-97.play-internet.pl Tutorial[664] : kCGErrorInvalidConnection: CGSGetCurrentCursorLocation: Invalid connection
Sun Mar 20 12:43:25 user-46-113-138-97.play-internet.pl Tutorial[664] : kCGErrorInvalidConnection: CGSNewWindowWithOpaqueShape: Invalid connection
2011-03-20 12:43:25.746 Tutorial[664:a0f] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error (1002) creating CGSWindow'
*** Call stack at first throw:
(
0 CoreFoundation 0x00007fff8807f7b4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x00007fff818b10f3 objc_exception_throw + 45
2 CoreFoundation 0x00007fff8807f5d7 +[NSException raise:format:arguments:] + 103
3 CoreFoundation 0x00007fff8807f564 +[NSException raise:format:] + 148
4 AppKit 0x00007fff80514ee2 _NSCreateWindowWithOpaqueShape2 + 473
5 AppKit 0x00007fff804a9489 -[NSWindow _commonAwake] + 1214
6 AppKit 0x00007fff804a616e -[NSWindow _commonInitFrame:styleMask:backing:defer:] + 1501
7 AppKit 0x00007fff804a4dfa -[NSWindow _initContent:styleMask:backing:defer:contentView:] + 1396
8 AppKit 0x00007fff804a4883 -[NSWindow initWithContentRect:styleMask:backing:defer:] + 42
9 Tutorial 0x0000000100001910 main + 504
10 Tutorial 0x0000000100001710 start + 52
11 ??? 0x0000000000000001 0x0 + 1
)
terminate called after throwing an instance of 'NSException'



#4 macieks72

macieks72

  • 9 873 postów

Napisano 20 marca 2011 - 12:53

Nie wiem dlaczego wybrałeś konsole application skoro chcesz tworzyć z GUI, ale nieważne.

Tutaj masz przykład jak z palca (w kodzie) zrobić okienko. Bez nibów.

#import <Cocoa/Cocoa.h>
#import "myView.h"

int main(int argc, const char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSWindow *window;
    myView *view;
    view = [[myView alloc] initWithFrame:NSMakeRect(0,100,200,200) ];
    window = [[NSWindow alloc] initWithContentRect:NSMakeRect(50,100,200,300) 
					 styleMask:NSTitledWindowMask | NSResizableWindowMask
					   backing:NSBackingStoreBuffered
					     defer:TRUE];
    
    NSTextField *text=[[NSTextField alloc]initWithFrame:NSMakeRect(10,60,180,22) ];
    [text setStringValue:@"sample text"];
    
    NSButton *button=[[NSButton alloc]initWithFrame:NSMakeRect(10,10,180,32) ];
    [button setBezelStyle:NSRoundedBezelStyle];
    [button setTitle:@"Quit"];
    [button setTarget:NSApp];
    [button setAction:@selector(terminate:)];
    
    
    [window setTitle:@"test1"];
   
    [[window contentView] addSubview:view];
    [[window contentView] addSubview:text];
    [[window contentView] addSubview:button];
    
    [NSApplication sharedApplication];
    [window makeKeyAndOrderFront: nil];
    [pool release];
    
    [NSApp run];
    return 0;
}

i myView.m

#import "myView.h"

@implementation myView

- (void)drawRect:(NSRect)rect
{
    NSBezierPath *path = [NSBezierPath bezierPathWithRect:NSMakeRect(10,10,180,180)];
    [[NSColor greenColor] set];
    [path fill];

}
@end

i myView.h

#import <Cocoa/Cocoa.h>

@interface myView : NSView
{
}
@end

kompilacja z palca:
cc -framework Cocoa myView.m main.m -o ./test.app/Contents/MacOS/test

Tutaj jakbyś chciał kody:
http://cl.ly/2e1W1O1w3X240F2d3G2b

#5 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 20 marca 2011 - 13:47

Nie wiem dlaczego wybrałeś konsole application skoro chcesz tworzyć z GUI, ale nieważne.
Tutaj masz przykład jak z palca (w kodzie) zrobić okienko. Bez nibów.

Jak pisałem wcześniej potrafię przy pomocy konsolowej aplikacji w Javie czy C# stworzyć okienkową, chciałem sprawdzić na czym polega podobne tworzenie aplikacji okienkowej w Objective-c, jeśli nie konsolową to jaką w której nie będę musiał korzystać z Interface Bulider'a

Skopiowałem Twój kod do mojego ale nie wychodzi do końca tzn.

myView *view;
view = [[myView alloc] initWithFrame:NSMakeRect(0,100,200,200) ];

w tej linijce po wyjściu z metody initWithFrame:NSMakeRect(0,100,200,200) program się zawiesza i znowu muszę go wyłączać brutalnie (terminate) do aplikacji dodałem frameworki:
-AppKit
-Cocoa
-CocoaData
-Fundation

#6 macieks72

macieks72

  • 9 873 postów

Napisano 20 marca 2011 - 14:22

No ja Ci nie pomogę bo nie bardzo się znam na obj-c, od czasu do czasu się nim tylko bawię jak mam akurat ochotę na obj-c. Ściągnij cały kod który dałem w linku i zobacz, ale w zasadzie dokładnie to samo wkleiłem tutaj. Tamto się na pewno kompiluje i działa. Ja to kompilowałem z palca, ale widzę że tylko "Cocoa framework" jest dodany do opcji kompilatora "-framework Cocoa". I to działa na 100% co wyżej podałem. Pokombinuj ;)

#7 Roberto

Roberto
  • 13 752 postów
  • SkądWrocław

Napisano 20 marca 2011 - 14:24

macieks72 - forum wcięło ci pierwszego importa ;]

#8 macieks72

macieks72

  • 9 873 postów

Napisano 20 marca 2011 - 14:27

No tak, nie zauważyłem, był jako tag html potraktowany pewnie. Poprawiłem już. W każdym razie macQUB weź sobie zipa z kodem z linku.

#9 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 21 marca 2011 - 19:57

W każdym razie macQUB weź sobie zipa z kodem z linku.

Dzięki jednak musiałem małą poprawkę zrobić w tym kodzie a mianowicie

[NSApplication sharedApplication];

musi być zaraz po

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

bo inaczej wyrzuca błędy związane z linkowaniem, ale powstał inny problem aplikacja za szybko się zamyka tylko miga jak ją zatrzymać?

#10 macieks72

macieks72

  • 9 873 postów

Napisano 21 marca 2011 - 20:11

U mnie nie miga, a normalnie się uruchamia okno.

#11 macQUB

macQUB
  • 334 postów
  • SkądPodkarpacie

Napisano 21 marca 2011 - 21:22

Znalazłem na sieci to
@interface MyClass:NSObject{
}
@property (nonatomic, retain) NSWindow *window;
@end

@implementation MyClass
@synthesize window;
- (void)applicationDidFinishLaunching: (NSNotification *)notification {
	NSLog(@"Finished Launching %@", notification);
	
	NSWindow *localWindow = [[NSWindow alloc] initWithContentRect:[[NSScreen
																	mainScreen] frame]
							 
														styleMask:NSResizableWindowMask
							 
														  backing:NSBackingStoreBuffered
															defer:NO];
	[self setWindow:localWindow];
	[localWindow release];
	
	NSView *localView = [[NSView alloc] init];
	[window setContentView:localView];
	[localView release];
	
	[window setLevel:NSFloatingWindowLevel];
	[window makeKeyAndOrderFront:self];
}
@end

int main (int argc, const char *argv[]) {
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
	
	// The first time sharedApplication is called, it creates an instance of NSApplication
	//

	[NSApplication sharedApplication];
	
	NSLog(@"%@", NSApp);
	
	MyClass *myClass = [[MyClass alloc] init];
	[NSApp setDelegate:myClass];
	[NSApp run];
	
	[myClass release];
	[pool release];
	
	return (0);
}
i działa (pojawia się okno), teraz tylko muszę dodać obsługę zamykania okna, dzięki za pomoc

używaj znaczników [ code ] do cytowania kodu




Użytkownicy przeglądający ten temat: 1

0 użytkowników, 1 gości, 0 anonimowych